изменить файл записи программно в DirectShow - PullRequest
1 голос
/ 17 мая 2011

Я сделал консольное приложение, используя directshow, эту запись из живого источника (теперь веб-камера, затем телевизионная карта захвата), добавил текущую дату и время в оверлее, а затем сохранил аудио и видео как .asf.Теперь я хочу, чтобы выходной файл менялся каждые 60 минут без остановки графика.Я не должен терять ни секунды живой трансляции.График выглядит примерно так:

http://imageshack.us/photo/my-images/543/graphp.jpg/

Я взглянул на GMFBridge, но у меня есть некоторые проблемы с компиляцией с их примерами.Мне интересно, есть ли способ отделить то, что существует, от оверлейного фильтра и аудиоисточника, подключить их к другому устройству записи asf (приостановлено), а затем переключать их каждые 60 минут.Имя файла приостановленного фильтра asf должно измениться (pp.asf, pp2.asf, pp4.asf ...).Примерно так:

http://imageshack.us/photo/my-images/546/graph1f.jpg/

с pp1 на паузе.В Интернете я нашел людей, которые говорят, что программа asf удаляет текущий файл, если график не переходит в режим остановки.

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Что ж, у меня есть продукт (http://www.videophill.com), который в точности соответствует тому, что вы описали (он используется для целей записи соответствия трансляциям) - и я обнаружил, что единственный способ сделать это - это:создайте граф dshow, который будет использоваться только для захвата аудио и видео

, затем в конце графика вставьте фильтры samplegrabber, как для аудио, так и видео , затем используйте IWMWritter чтобы создать и сохранить файл wmv, используя сэмплы, извлеченные из сэмплер-фильтров , когда придет время, закройте один IWMWritter и создайте другой.

Таким образом, вы не будетепотеря одного кадра при переключении выходных файлов.

Конечно, существует также вопрос постановки в очередь и хранения семплов (при переключении записывающих устройств) и правильного выравнивания аудио / видео временных меток, но из моегоисследования, это единственный «нормальный» способ сделать это, и я использовал на практике.

1 голос
/ 18 мая 2011

Решение заключается в написании собственного фильтра DShow с двумя входными контактами в вашем случае.Один для аудио потока, а другой для видео потока.Внутри этого фильтра (не обязательно быть внутри с точки зрения архитектуры, потому что вы также можете, например, использовать обратные вызовы и выполнять работу где-то еще), вы должны создавать файлы asf.При переключении файлов аудио / видео данные будут храниться в кеше (например, достаточно большой кольцевой буфер).Вы также можете просматривать и изменять A / V-синхронизацию в этом фильтре.Для записи ASF-файлов я бы порекомендовал Windows Media Format SDK.
Вы также можете добавить выходные выводы, если хотите дополнительно передавать аудио / видео данные, если это необходимо для предварительного просмотра, параллельной потоковой передачи и т. Д.

0 голосов
/ 18 мая 2011

GMFBridge - жизнеспособное, но сложное решение, более прямой подход, который я реализовывал в прошлом, - это запрос вашего ASF Writer для интерфейса IWMWriterAdvanced2 и настройка пользовательского приемника. В этом интерфейсе у вас есть методы для удаления и добавления приемников в ваш писатель ASF. Автоматически подключенный приемник запишет в указанный вами файл. Один из способов написать, куда вы хотите, это

1.) Удалить все приемники по умолчанию:

pWriterAdv->RemoveSink(NULL);

2.) Зарегистрировать мойку:

pWriterAdv->AddSink((IWMWriterSink*)&streamSink);

Настраиваемый приемник может быть классом, который реализует IWMWriterSink, что требует реализации методов обратного вызова, которые вызываются, например, когда записывается заголовок ASF (OnHeader(/* [in] */ INSSBuffer *pHeader);) и когда записывается пакет данных (OnDataUnit(/* [in] */ INSSBuffer *pDataUnit);) - в затем вы можете писать их в любом месте, например, предлагая дополнительные методы для этого класса, где вы можете указать имя файла, в который хотите записать.

Обратите внимание, что это решение не совсем так, как вы хотели, если вам нужно записать информацию заголовка в каждый из 60-минутных файлов - после начального заголовка вы получите только данные пакета ASF. Обходным путем для этого может быть перезапись начального заголовка перед любыми пакетными данными каждого файла, однако это приведет к созданию неиндексированного (не доступного для поиска) файла ASF.

...