将本机WebRTC的远程音频数据保存到文件

时间:2019-11-08 16:56:55

标签: c# c++ c audio webrtc

我正在尝试将通话的远程音频数据保存到文件中。我遇到的问题是,似乎远程音频数据在文件中的格式似乎不正确。我要保存的样本之间似乎有空白空间。因为我在Unity中使用WebRTC,所以在回购中使用了unity示例,但是我对其进行了修改,以将Audio Observer分成自己的类。

//audio_observer.h
class AudioObserver : public webrtc::AudioTrackSinkInterface {
public:
  AudioObserver() {}
  ~AudioObserver() {}

  void SetAudioCallback(AUDIODATAREADY_CALLBACK callback);

  void OnData(const void* audio_data,
              int bits_per_sample,
              int sample_rate,
              size_t number_of_channels,
              size_t number_of_frames) override;

private:
  AUDIODATAREADY_CALLBACK OnAudioDataReady = nullptr;
  std::mutex mutex;
};

//audio_observer.cc
void AudioObserver::SetAudioCallback(AUDIODATAREADY_CALLBACK callback) {
  std::lock_guard<std::mutex> lock(mutex);
  OnAudioDataReady = callback;
}

void AudioObserver::OnData(const void* audio_data,
                                  int bits_per_sample,
                                  int sample_rate,
                                  size_t number_of_channels,
                                  size_t number_of_frames) {
  std::unique_lock<std::mutex> lock(mutex);

  if (OnAudioDataReady)
    OnAudioDataReady(audio_data, bits_per_sample, sample_rate,
                 static_cast<int>(number_of_channels),
                 static_cast<int>(number_of_frames));
}

我将数据保存在C#中,因为每次更改内容时都不必重建插件。我很确定这与在C ++中使用fstream是一样的事情。

private void OnRemoteAudioDataReady(IntPtr data, int bitsPerSample, int sampleRate, int numberOfChannels, int numberOfFrames)
{
    unsafe
    {
        using (UnmanagedMemoryStream unmanagedMemoryStream = new UnmanagedMemoryStream((byte*)data, numberOfChannels * numberOfFrames * bitsPerSample))
        {
            unmanagedMemoryStream.CopyTo(_fileStream);
            _fileStream.Flush();
        }
    }
}

这是指向我要保存的raw audio PCM data和添加了WAV标头的WAV file的两个链接。音频本身每秒都会拍手。如果将其导入到具有格式设置为带符号的16位PCM,大端字节序,1通道和如果将调试日志放入AudioObserver::OnData,则将输出48000 Hz采样率,因为这是WebRTC正在输出的格式。因此,我很难弄清为什么PCM原始数据这么长,以及为什么音频样本之间有一堆空白。

0 个答案:

没有答案