Почему добавление рендерера к моему графику фильтра DirectShow сглаживает аудиовход на график?

У меня есть граф фильтра DirectShow в моем приложении Delphi 6, построенном с использованием библиотеки компонентов DSPACK. Структура графа выглядит следующим образом:

  • Пользовательский push-аудио фильтр
  • Образец граббер
  • Ти фильтр (но только когда я включаю как WAV File Writer, так и Renderer)
  • Renderer (предпочтительное устройство вывода ПК)
  • WAV File Writer

Тройной фильтр добавляется в график только в том случае, если у меня включены оба фильтра Renderer и WAV File Writer. В противном случае я подключаю только фильтр, который включен непосредственно к Sample Grabber.

Звук доставляется через подключенный к WiFi аудиосервер RTSP, который транслирует аудио в режиме реального времени. Если я не включаю Wav File Writer, то звук, исходящий из моих наушников, имеет типичные звуки накачки и случайные щелчки, связанные с небуферизованным аудиопотоком. Как ни странно, как только я включаю фильтр WAV File Writer, звук становится ровным, как стекло.

У меня есть исходный код для WAV File Writer, и он в основном обрабатывает задачи вывода правильного заголовка WAV-файла, когда это необходимо, и записи аудио-буферов по мере необходимости, не намного больше, чем это. Поэтому я нахожу странным, что его включение сглаживает входящий аудиопоток, тем более что он не находится выше по течению от рендерера (фильтра), а вместо этого является одноранговым фильтром, свисающим с конца тройного фильтра рядом с рендерером.

Может кто-нибудь сказать мне, что может произойти, чтобы сделать доставку звука, когда я включаю фильтр File Writer? Фильтр тройника выполняет какую-либо внутреннюю буферизацию? Я хочу продублировать тот же механизм, чтобы иметь плавный звук, когда File Writer не включен. Я пытаюсь избежать добавления своей собственной буферизации, потому что я не хочу добавлять больше задержки в аудиопоток в реальном времени, чем нужно.

1 ответ

Решение

Если у вас есть живой источник, и вы можете одновременно прослушивать его и доставленное аудио, вы можете сказать, вводит ли добавление File Writer задержку, что может быть причиной разницы. Или может быть изменение в размере или количестве согласованных буферов в DecideBufferSize,

Я бы предложил ввести явную буферизацию в вашем push-фильтре, например, добавить смещение к временным меткам выборки медиа. Собственная буферизация в фильтре Tee может быть ненадежной. Изменения во времени доставки неизбежны.

Более сложный подход, если вам нужно работать с минимальной буферизацией или без нее, может состоять в том, чтобы растянуть / сжать аудио, сохраняя высоту тона.

Другие вопросы по тегам