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

Написано

в

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

Снимаем кино

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

raspivid -o cam.h264
pi@cam ~ $ ls -l
-rw-r--r-- 1 pi pi 10154858 Апр 5 15:12 cam.h264

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

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

pi@cam ~ $ file cam.h264 
cam.h264: JVT NAL sequence, H.264 video @ L 40

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

pi@cam ~ $ avprobe cam.h264 
avprobe version 0.8.10-6:0.8.10-1+rpi1, Copyright (c) 2007-2013 the Libav developers
 built on Mar 22 2014 02:13:15 with gcc 4.6.3
[h264 @ 0x1a69660] Estimating duration from bitrate, this may be inaccurate
Input #0, h264, from 'cam.h264':
 Duration: N/A, bitrate: N/A
 Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 25 fps, 25 tbr, 1200k tbn, 2400k tbc

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

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

legolas@bingo ~$ ssh -X pi@cam

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

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

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

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

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

pi@cam ~ $ avconv -i cam.h264 -vcodec copy -f mp4 cam.mp4

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

pi@cam ~ $ ls -l
-rw-r--r-- 1 pi pi 10154858 Апр 5 15:12 cam.h264
-rw-r--r-- 1 pi pi 10156809 Апр 5 15:38 cam.mp4

Аналогично, смотрим что за файл получился:
pi@cam ~ $ file cam.mp4 
cam.mp4: ISO Media, MPEG v4 system, version 1
pi@cam ~ $ avprobe cam.mp4
avprobe version 0.8.10-6:0.8.10-1+rpi1, Copyright (c) 2007-2013 the Libav developers
 built on Mar 22 2014 02:13:15 with gcc 4.6.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cam.mp4':
 Metadata:
 major_brand : isom
 minor_version : 512
 compatible_brands: isomiso2avc1mp41
 encoder : Lavf53.21.1
 Duration: 00:00:00.04, start: 0.000000, bitrate: 2031361 kb/s
 Stream #0.0(und): Video: h264 (High), yuv420p, 1920x1080, 2030971 kb/s, 3575 fps, 1200k tbn, 2400k tbc

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

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

pi@cam ~ $ mplayer cam.mp4

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

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

pi@cam ~ $ mplayer -fps 25 cam.h264

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

raspivid -o - | avconv -i - -vcodec copy -f mp4 cam.mp4

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

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

pi@cam ~ $ avconv -codecs

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

pi@cam ~ $ avconv -formats

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

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

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

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *