2016-07-08 11 views
0

Когда Directshow AVIMux снабжен двумя потоками данных (например, аудио и видео), а один поток начинается бит перед другим, есть ли способ управлять тем, как ведет себя AVIMux? А именно, если AVIMux получает несколько видеокадров перед запуском аудио, он фактически опускает видеокадры с выходного AVI. Это контрастирует с тем, что он делает, когда звук отсутствует в конце, когда он включает видеокадры в любом случае.Управление обрезкой поведения DirectShow's AVIMux?

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

Есть ли хороший способ сделать это? Я могу представить, как обертывание двух фильтров в пользовательский фильтр со своим собственным графиком и вставлять тишину по мере необходимости, но было бы замечательно, если бы не приходилось сталкиваться со всеми этими проблемами.

ответ

0

Вопрос имеет, казалось бы, неверное предположение о снижении кадров в мультиплексоре. Мультиплексор просматривает отметки времени видео и аудио данных. Если «несколько кадров до ...» означает, что метки времени являются отрицательными, а данные являются данными преролла, то они удаляются и исключаются из результирующего файла. В противном случае он включается независимо от фактического порядка данных на входе мультиплексора. Соответствующая звуковая тишина будет присутствовать в начале звуковой дорожки.

То есть, убедитесь, что данные имеют правильную отметку времени, и мультиплексор получит ее.

+0

Спасибо за идею; к сожалению, это не соответствует тому, что я вижу. Я сделал простой график, который принимает существующий файл avi, разбивается на видео/аудиопотоки, а затем сдвигает временные метки и аудио вперед примерно на 100 мс. Затем это объединяется обратно через мультиплексор AVI и выписывается. Результатом является файл AVI, который меньше и на 6 кадров короче. Я могу повторить процесс и постоянно обрезать 6 кадров каждый раз. Все видеокадры имеют положительные временные метки. Я не понимал, что отрицательные временные метки также могут привести к снижению, поэтому я буду следить за этим. – aggieNick02

+0

Чтобы добавить немного и уточнить после нескольких экспериментов, смещение аудиоданных приводит к тому, что файл AVI имеет тот же размер, что и оригинал, но, глядя на полученный AVI-файл в directshow, virtualdub и т. Д., Все кадры перед первым звуком кадр пропускается. Если вы запустите полученный файл через простой сплиттер avi и avi mux обратно, то есть когда размер файла действительно упадет. – aggieNick02

+0

Я также подтвердил ваше заявление об отрицательных временных отметках; если время всего видеоролика отрицательное, оно действительно отбрасывается. Если какая-либо часть положительная, она сохраняется. Источник directshow, с которым я работаю, действительно иногда выплевывает первый кадр со временем, полностью отрицательным, поэтому это здорово знать и спасает меня от других головных болей. – aggieNick02

0

tl; dr - для моего случая использования, процесс обработки кадра, который не присутствует в конечном AVI, является showstopper, а процесс мультиплексирования/демонстрации AVI достаточно сложный, что мне лучше просто принять небольшое количество кадры могут быть сброшены в начале. Таким образом, я, скорее всего, соглашусь на то, чтобы нажимать несколько специальных кадров в начале (идентифицированных с помощью пары GUID/счетчика, закодированной в пикселях), прежде чем я начну обрабатывать фреймы. Затем я могу найти эти специальные кадры после записи AVI для определения кадра, в котором начинается обработка.

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

То есть, avi-плееры, такие как virtualdub и VLC, и даже разветвитель DirectShow AVI, игнорируют/качают любые видеокадры, присутствующие до начала звука. Поэтому я предполагаю, что вам придется проанализировать файл AVI с помощью какой-либо другой библиотеки для извлечения предустановленных кадров.

Причина, по которой это меня беспокоит, заключается в том, что я пишу параллельную структуру данных с записью для каждого кадра в файле AVI, и мне нужно знать, какие данные идут с кадром. Если кадры удаляются из AVI, я не могу сопоставить кадры и данные.

У меня был успех с созданием настраиваемых фильтров преобразования после фильтров видео/аудио захвата. Эти фильтры смотрят на отметки времени и отбрасывают видеофрагменты до тех пор, пока не будет установлено время начала аудио, и видеофрагменты будут после этого. Затем фильтры downstream знают, что они могут полагаться на видеофрагменты, которые они обрабатывают. Недостатком является то, что звуковой фильтр фактически подает сэмплы с задержкой, поэтому, когда звук начинается с 100 мс, я не обнаруживаю, пока я уже не обрабатываю видеокадр с частотой 250 мс, а это означает, что я сбросил 250 мс видеоданных, чтобы обеспечить Я знаю, когда у видеокадров будет сопутствующий звук. Объедините это с различными инструментами AVI, которые ведут себя по-разному, когда видео запускает более 1 продолжительности видеозаписи после запуска звука, и моя уверенность в попытке управлять AVIMux/Splitter начинает ослабевать.

Все это приводит меня к выводу, что AVIMux и AVI Splitter достаточно сложны, чтобы не пытаться точно их контролировать.