Categories

A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.

Смотрим 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="">