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

Writing WebRTC (AudioTrackSinkInterface) raw audio to disc

我正在尝试录制通过 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();
}

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

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

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

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

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();
}

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

要向@ZoolWay 已经正确的答案添加更多详细信息,我在 Windows 平台中不以二进制模式打开文件时遇到文件损坏问题。简而言之,确保文件具有 ios_base::binary 标志:

std::ofstream stream(LR"(D:\test.pcm)", ios_base::binary);

[...]

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      
    stream.write(reinterpret_cast<const char*>(audio_data), number_of_bytes);
    stream.flush();
}

为我解决了这个问题。