将WebRTC(AudioTrackSinkInterface)原始音频写入光盘

Zoo*_*Way 5 c++ windows audio webrtc

我正在尝试记录WebRTC传输的音频PeerConnection MediaStream。我在实现的音轨中添加了一个接收器AudioTrackSinkInterface。它实现了以下OnData方法:

void TestAudioTrackSink::OnData(const void* audio_data, int bits_per_sample, int sample_rate, size_t number_of_channels, size_t number_of_frames) {
    size_t valueCount = number_of_channels * number_of_frames;
    int16_t *_data = (int16_t*)audio_data;

    f.write((char*)&_data, sizeof(int16_t) * valueCount);
    f.flush();
}
Run Code Online (Sandbox Code Playgroud)

f是一个ofstream每个样本的位数为16,采样率为 16000,通道为1,为160。

但是,当我使用AudaCity原始导入(带符号的16位PCM,小字节序,单声道,采样率16000)打开创建的文件时,我听不到有意义的音频。

如何正确写原始音频日期?

Zoo*_*Way 4

结果最后我访问了指针本身存储的数据,而不是它指向的地方,这是一个经典。我的方法的正确实现如下所示:

void TestAudioTrackSink::OnData(const void* audio_data, int bits_per_sample, int sample_rate, size_t number_of_channels, size_t number_of_frames) {
    size_t number_of_bytes = number_of_channels * number_of_frames * sizeof(int16_t); //assuming bits_per_sample is 16      
    f.write(reinterpret_cast<const char*>(audio_data), number_of_bytes);
    f.flush();
}
Run Code Online (Sandbox Code Playgroud)

注意:为了对 webrtc 本机检索和发送的音频数据进行更多处理,我现在正在检查自定义 AudioDeviceModule。