我正在尝试将通话的远程音频数据保存到文件中。我遇到的问题是,似乎远程音频数据在文件中的格式似乎不正确。我要保存的样本之间似乎有空白空间。因为我在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原始数据这么长,以及为什么音频样本之间有一堆空白。