Каков правильный размер выборки для фильтра push-источника DirectShow, который обеспечивает только звук? - PullRequest
1 голос
/ 25 октября 2011

У меня есть программа Delphi 6 Pro, использующая библиотеку DSPACK для работы фильтра DirectShow.Я создаю свой первый Push Source Filter, который будет обеспечивать аудио из пользовательского аудиоисточника.В настоящее время мой самый большой вопрос заключается в том, как определить объем данных, которые я бы скопировал в выходной буфер фильтра во время вызова FillBuffer ().

Действительно ли я копирую только один аудиосэмпл за раз?В моем случае это будет всего 2 байта, поскольку каждый аудиосэмпл имеет ширину 16 бит, одноканальный.Это кажется в корне неэффективным.Или я копирую блок сэмплов сразу, и если да, то какую правильную логику использовать при определении количества байтов для копирования?Правильна ли логика, чтобы просто использовать значение, возвращаемое Sample.GetSize () в качестве количества предоставляемых байтов, где Sample - это объект IMediaSample, переданный в вызов FillBuffer ()?

Кроме того, если у кого-то естьЛюбые советы или предостережения относительно создания аудиоисточника исходного фильтра по сравнению с видео, пожалуйста, разместите их здесь.Пример, над которым я работаю, - это видеофильтр, который передает текущее изображение рабочего стола в виде серии растровых изображений.Я беспокоюсь, что сделаю что-то, что не подходит для фильтра DirectShow только для аудио, когда в качестве отправной точки используется видеофильтр.Кроме того, звук, поступающий из этого фильтра, должен быть в режиме реального времени, так как он включает в себя прямую аудиосвязь между двумя сторонами.

1 Ответ

1 голос
/ 26 октября 2011

Действительно ли я копирую только один аудиосэмпл за раз?В моем случае это будет всего 2 байта, поскольку каждый аудиосэмпл имеет ширину 16 бит, одноканальный.Это кажется в корне неэффективным.Или я копирую блок сэмплов сразу ...

Вы копируете блок сразу.Фактически, поскольку у вас есть фильтр исходящих / исходных данных, именно вы генерируете данные.Таким образом, ваш фильтр запрашивает подключенный распределитель памяти на выходном выводе, чтобы получить новый буфер для переноса данных.Вы получаете буфер, и у вас есть его емкость, скажем, N байтов.Вы можете заполнять буфер по своему усмотрению, помещая в него больше или меньше выборок, всего несколько байтов или как можно больше.

Чтобы избежать сложностей, вы должны заполнять данные при выравнивании блоков, специфично длятип носителя.Со звуком это обычно WAVEFORMATEX::nBlockAlign значение.Тем не менее, даже если вы этого не сделаете, это может быть хорошо для определенного однорангового фильтра, который будет буферизировать данные внутри себя и обрабатывать выравнивание самостоятельно.Также с хорошим выравниванием было бы легче прикрепить правильные метки времени к данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...