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

时间:2016-11-04 15:51:44

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

fofstream每个样本的位数为16,采样率为16000,通道为1,为160。

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

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

2 个答案:

答案 0 :(得分:2)

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

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。

答案 1 :(得分:0)

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

为我解决了这个问题。