2015-08-19 2 views
0

У меня есть приложение, которое я написал для обеспечения имитации потоков MP4-камеры в «черный ящик». Я использую цитаты из иронии, потому что у меня нет доступа к ее источникам, но у нас есть контракт на поддержку с продавцом, который это делает.VLC 2.2 и уровни

Этот черный ящик поддерживает h.264 уровень 2.2. Он не использует ничего подобного SDP, но просто ожидает, что потоки камеры будут 640x480 @ 30hz. Я понимаю, что это достаточно стандартный выход для камер наблюдения.

Так что мое приложение использует vlc (libVlc to specific) для потоковой передачи файлов MP4 на это устройство. У меня этот рабочий штраф (с one minor exception, но это отдельный вопрос). Тем не менее, то есть с Vlc 2.1.5. Когда я попробовал обновить до последней версии 2.2.1, вместо видео на другой стороне нашего черного ящика мы просто видим бело-серые квадраты.

Наш поставщик просмотрел дампы с проводами и сообщил мне, что поток vlc 2.2.1 сообщает себя как Level 5.1 вместо 2.2 и что теперь он использует High Profile вместо Baseline или Main. Похоже, VLC пытается «обновить» (перекод?) Мое видео на меня, и это испортило читателя в этом черном ящике.

Есть ли способ вернуть прежнее поведение из vlc 2.1.5 или заставить его использовать уровень и профиль по моему выбору?

+0

Это не может быть прав. 640x480 @ 30 fps - Уровень 3 не 2.2. Максимальное значение fps для этого разрешения при 2.2 составляет ~ 16,85. Все ваши исходные файлы MP4 на 640x480 @ 30 fps? – aergistal

+0

@aergistal - вот что говорит мне вкладка «Codec» диалогового окна Current Media Information VLC. Результат, который пришел с ними, также говорит, что они 640x480. Уровень ... Я не уверен, как бы дважды проверить это. –

+0

Я только что получил значок «популярного вопроса» для этого 0-балльного вопроса. Позор, для этого нет лишнего значка! Я мог повесить его рядом со всеми моими «переливами». –

ответ

2

H.264 Профили

Profiles представляют собой наборы возможностей. Если ваш черный ящик поддерживает только профиль Baseline, он не сможет декодировать поток, используя High.

В VLC вы можете установить профиль H.264, который будет использоваться в x264 кодировщика, как это:

--sout="#transcode{vcodec=h264,venc=x264{profile=baseline}...

H.264 Уровни

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

Прежде всего, уровень для 640x480 @ 30 fps равен 3, а не 2.2.

Вы можете вычислить это следующим образом:

macrobolocks = ceil(640/16) * ceil(480/16) = 1200 
macroblocks/s = macroblocks * 30 = 36000 

Причиной ceil является то, что разрешение без mod16 обиты кратного 16.

Затем вы посмотрите на H.264 Levels. Вы находитесь в пределах ограничения размера кадра для 2.2, который равен 1620, но максимальная скорость декодирования больше 20252, поэтому вам нужно выбрать следующий уровень, который равен 3. Вам также нужно будет рассмотреть максимальный битрейт для профиля Baseline в этой таблице.

Если у вас есть Android устройство, которое вы можете скачать мой H.264 Calculator app from the Amazon App Store (я могу отправить вам apk, если вам не нравится их Орвелианские разрешения для приложений)

x264 датчика автоматически выбирает уровень на основе ваших параметров кодирования , С VLC вы можете установить флаг самостоятельно, используя что-то вроде:

--sout="#transcode{vcodec=h264,venc=x264{profile=baseline,level=22}"...

Осторожно, это устанавливает флаг выхода кодера и фактически не производит Level 2.2 потока. Вы можете поместить любые значения, которые вы хотите, поэтому можно отметить поток Full HD со скоростью 60 кадров в секунду как Level 2.2, даже если он нигде не ограничивает уровень.

VLC перекодирование

Если вы хотите, чтобы убедиться, что вы отправляете правильный поток вам нужно перекодировать исходный материал. Это пример для 640x480 @ 30 fps, который приводит к потоку H.264 Level 3, как я показал вам выше. Если вы хотите Level 2.2, вам необходимо снизить разрешение или частоту кадров или и то, и другое. В этом случае ваш битрейт видео может снизиться.

cvlc input.mp4 --sout="#transcode{vcodec=h264,venc=x264{profile=baseline},fps=30,width=640,height=480,vb=1372,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{...}

MediaInfo

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

Смежные вопросы