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