У меня есть фильтр push-источника DirectShow, который накапливает данные из пользовательских аудиопотоков с отметкой времени , а не . Он буферизует их, а затем отправляет их на внешнее устройство вывода звука, которое принимает аудиобуферы через HTTP-сервер, предоставляемый устройством (вы отправляете ему аудиобуферы через HTTP). Устройство вывода звука, к сожалению, чувствительно к синхронизации. Отправка слишком большого количества данных за один раз или (естественно) слишком мало данных за один раз приводит к путанице и проблемам с воспроизведением, таким как «заикание».
Мне нужно отправлять буферы через HTTP-соединение с точно установленным интервалом времени, точно так же, как это делает устройство захвата, которое использует аппаратную выборку и тактирование, когда публикует захваченные данные. Я предполагаю, что мне нужно создать критический поток в реальном времени и использовать его. Вот мои вопросы:
Как мне выбрать время? Какие вызовы Windows API и структуры данных я использую, чтобы сделать это правильно? Что-то с использованием функций счетчика производительности Windows?
Как заблокировать, когда я не готов опубликовать какие-либо данные в методе FillBuffer () моего push-фильтра? Mutex? Семафор
Как избежать дрейфа? Например, если мне нужно сгенерировать 50-миллисекундный буфер и я эмулирую частоту выборки 8000, как мне убедиться, что я не получаю заниженных значений или не превышаю рассчитанное время публикации таким образом, чтобы это накапливалось со временем, что может привести к пробелы в аудио?