Программы на C++. Форум разработчиков
Anonymous
Устранение проблем с плохим качеством звука при кольцевой записи WASAPI
Сообщение
Anonymous » 19 окт 2024, 11:41
Я пытаюсь использовать 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]
1729327260
Anonymous
Я пытаюсь использовать WASAPI для обратной записи, но записанный звук в формате WAV имеет значительно более низкое качество звука по сравнению с записываемым исходным звуком. Звук заметно отличается, и мне не удалось найти решение этой проблемы. [code]// 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]