Я пытаюсь сохранить удаленные аудиоданные вызова в файл. Проблема, с которой я столкнулся, заключается в том, что не похоже, что удаленные аудиоданные правильно отформатированы в файле. Кажется, между образцами, которые я сохраняю, есть свободное место. Поскольку я использую 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 #, так как я нене нужно перестраивать плагин каждый раз, когда я что-то меняю. Я почти уверен, что это то же самое, что и использование fstream в C ++.
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();
}
}
}
Вот две ссылки на необработанные аудио PCM-данные , которые я сохраняю, и WAV-файл , к которому я добавил WAV-заголовки. Аудио от меня хлопает каждую секунду или около того. Предполагается, что он будет длиться около 13 секунд, но файл необработанных данных PCM по какой-то причине составляет 1 минуту 43 секунды, если вы импортируете его в Audactiy с настройками формата, такими как 16-разрядный PCM со знаком, порядок байтов с прямым порядком байтов, 1 канал иЧастота дискретизации 48000 Гц, поскольку это формат, который выводит WebRTC, если я помещаю журнал отладки в AudioObserver::OnData
. Поэтому я не могу понять, почему необработанные данные PCM такие длинные и почему между звуковыми сэмплами есть куча пустого пространства.