Смотрим Raspberry Pi: часть 2

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

Снимаем кино

Зайдем на Rpi и сделаем маленький фильм командой

В течении нескольких секунд на камере появится красный огонек, и потом появится файл cam.h264. Имя и расширение — совершенно произвольные. Я дал расширение h264 потому что утилита raspivid пишет в формате кодека h264.

Проверим, в каком формате прошла запись файла (повторю, расширение никакой роли не играет). Вначале очень полезной командой file:

Потом — более специализированной командой avprobe из состава медиабиблиотек libav:

Из этого делаем вывод, что файл действительно записан в формате h264,  размером 1920×1080 (да-да, это Full HD камера, кто бы мог подумать!), частота кадров — 25 в секунду.

Едем дальше: будем пробовать смотреть наше произведение в видеоплеере. Поскольку мы отказались от дисплея на Rpi, то будем смотреть вывод на своем компьютере bingo. Для этого перезайдем командой

В результате сетевой адрес дисплея моего компьютера bingo (переменная окружения DISPLAY) будет экспортирован на машину cam и все графическое что я буду запускать на cam будет отображаться на bingo.

Теперь не терпится проиграть этот файл в плеере и посмотреть что сняла камера? Ничего не получится. Запустим mplayer cam.h264 и увидим одну ругань. В чем же дело?

Кодеки и контейнеры

Дело в том, что хотя файл содержит полную видеоинформацию о фильме, этого недостаточно. Данные кодека h264 должны быть помещены в контейнер. Контейнер — это нечто, позволяющее внешним программам работать с аудиоданными в упорядоченном режиме. Можно привести аналогию: кодек это куча песка, но чтобы его куда-то отвезти, нужен железнодорожный состав с вагонами. Продолжая аналогию, говорим о том, что вагоны — это фреймы которые содержат данные кодека.

Для того чтобы сформировать контейнер нам подойдет команда avconv. Она умеет много чего другого, в частности перекодировать видео и аудио с одного формата в другой. Но это нам не нужно: мы просто сохраняем кодек h264 и помещаем его в контейнер mp4. При желании, можно выбрать какой нибудь другой контейнер, например avi. Тип контейнера указывает ключ -f. Командная строка будет выглядеть так:

Ключ -i указывает на входной файл, опция copy говорит о том что видеоданные перекодировать не нужно и они просто копируются в контейнер cam.mp4. В результате получаем контейнер с данными кодека:

Заметим, что размер контейнера чуть больше чем размер файла кодека. Так и должно быть: вагоны тоже чего-то стоят.

Берем попкорн и садимся смотреть видео:

Не забываем, что благодаря команде ssh -X смотрим видео не на Rpi, а на своей машине.

Здесь, справедливости ради, надо отметить, что мы смогли бы проиграть «чистый» файл cam.h264 и без контейнера. Для этого достаточно указать скорость поступления фреймов, которую плеер берет из контейнера:

Замечу, что поскольку в конечном счете нам нужен именно контейнер, то можно обойтись без промежуточного файла cam.h264:

Таким образом, различаем кодеки и контейнеры (в терминологии libav — форматы). Полезные команды:

узнать какие кодеки поддерживаются:

узнать какие форматы (контейнеры) поддерживаются:

Дальше поговорим о том, как обеспечить live streaming — передачу видео по сети.

Продолжение в следующем номере:

Смотрим Raspberry Pi: часть 3

Ответить

Вы можете использовать эти HTML теги

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">