Устранение проблем с плохим качеством звука при кольцевой записи WASAPIC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Устранение проблем с плохим качеством звука при кольцевой записи WASAPI

Сообщение Anonymous »

Я пытаюсь использовать WASAPI для обратной записи, но записанный звук в формате WAV имеет значительно более низкое качество звука по сравнению с записываемым исходным звуком. Звук заметно отличается, и мне не удалось найти решение этой проблемы.

Код: Выделить всё

// Record.h
#include 
#include 
#include 
#include 
#include 
#define REFTIMES_PER_SEC  10000000
#define REFTIMES_PER_MILLISEC  10000

#define EXIT_ON_ERROR(hres)  \
if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
if ((punk) != NULL)  \
{ (punk)->Release(); (punk) = NULL; }
// 定义WAV文件头部结构
struct WAVHeader {
char chunkID[4];        // 文件标识,通常为"RIFF"
uint32_t chunkSize;     // 文件大小
char format[4];         // 文件格式,“WAVE”
char subchunk1ID[4];    // 子块标识,“fmt”
uint32_t subchunk1Size; // 子块大小
uint16_t audioFormat;   // 音频格式,1为PCM格式
uint16_t numChannels;   // 声道数,1:单声道,2:双声道
uint32_t sampleRate;    // 采样率
uint32_t byteRate;      // 每秒的字节数
uint16_t blockAlign;    // 块对齐
uint16_t bitsPerSample; // 采样深度
char subchunk2ID[4];    // 子块标识,“data”
uint32_t subchunk2Size; // 子块大小
};
// 音频数据结构
struct WAVData {
struct WAVHeader header;  // 音频头部数据
uint8_t* sample;          // 音频数据
};

class WAVWriter {
public:
WAVWriter(const char* filename, WAVEFORMATEX* pwfx)
: file(filename, std::ios::binary), totalDataSize(0) {

if (!file.is_open()) {
std::cerr nChannels;
wavData.header.sampleRate = pwfx->nSamplesPerSec;
wavData.header.bitsPerSample = pwfx->wBitsPerSample;
wavData.header.byteRate = pwfx->nSamplesPerSec * pwfx->nChannels * pwfx->wBitsPerSample / 8;
wavData.header.blockAlign = pwfx->nChannels * pwfx->wBitsPerSample / 8;
}
void WriteData(BYTE* pData, UINT32 dataSize) {
if (!file.is_open()) return;

file.write(reinterpret_cast(pData), dataSize);
totalDataSize += dataSize;
}

void Finalize() {
if (!file.is_open()) return;

// 填写 WAV 头的最终大小信息
wavData.header.chunkSize = 36 + totalDataSize;  // 36 是 WAV 头部的大小减去文件头的前8字节
wavData.header.subchunk2Size=totalDataSize;
wavData.sample = new uint8_t[totalDataSize];

// 回到文件开始位置,写入更新后的头
file.seekp(0, std::ios::beg);
file.write(reinterpret_cast(&wavData.header), sizeof(wavData.header));
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79104516/troubleshooting-poor-audio-quality-in-wasapi-loopback-recording[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»