Как создать поток, который имитирует точность синхронизации фильтра захвата при создании аудиоданных? - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть фильтр push-источника DirectShow, который накапливает данные из пользовательских аудиопотоков с отметкой времени , а не . Он буферизует их, а затем отправляет их на внешнее устройство вывода звука, которое принимает аудиобуферы через HTTP-сервер, предоставляемый устройством (вы отправляете ему аудиобуферы через HTTP). Устройство вывода звука, к сожалению, чувствительно к синхронизации. Отправка слишком большого количества данных за один раз или (естественно) слишком мало данных за один раз приводит к путанице и проблемам с воспроизведением, таким как «заикание».

Мне нужно отправлять буферы через HTTP-соединение с точно установленным интервалом времени, точно так же, как это делает устройство захвата, которое использует аппаратную выборку и тактирование, когда публикует захваченные данные. Я предполагаю, что мне нужно создать критический поток в реальном времени и использовать его. Вот мои вопросы:

  1. Как мне выбрать время? Какие вызовы Windows API и структуры данных я использую, чтобы сделать это правильно? Что-то с использованием функций счетчика производительности Windows?

  2. Как заблокировать, когда я не готов опубликовать какие-либо данные в методе FillBuffer () моего push-фильтра? Mutex? Семафор

  3. Как избежать дрейфа? Например, если мне нужно сгенерировать 50-миллисекундный буфер и я эмулирую частоту выборки 8000, как мне убедиться, что я не получаю заниженных значений или не превышаю рассчитанное время публикации таким образом, чтобы это накапливалось со временем, что может привести к пробелы в аудио?

1 Ответ

0 голосов
/ 20 ноября 2011

относительно времени и дрейфа; Вы можете сделать следующее:

  • Когда вы начинаете потоковую передачу, сохраните текущее время в StreamingPos.
  • Теперь каждый раз, когда вы отправляете 50 мс, вы увеличиваете StreamingPos на 50 мс.
  • И не отправляйте никаких дополнительных данных, пока текущее время не достигнет StreamingPos.

Таким образом, вы синхронизируете данные с вашим локальным временем системы. Это не должно точно соответствовать часам устройства игрока. Но это не должно быть проблемой. Единственный способ решить эту проблему - синхронизировать оба устройства с одним и тем же источником времени.

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