Сохранение удаленных аудиоданных Native WebRTC в файл - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь сохранить удаленные аудиоданные вызова в файл. Проблема, с которой я столкнулся, заключается в том, что не похоже, что удаленные аудиоданные правильно отформатированы в файле. Кажется, между образцами, которые я сохраняю, есть свободное место. Поскольку я использую 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 такие длинные и почему между звуковыми сэмплами есть куча пустого пространства.

...