Вначале, подготовим два файла для опытов. Экспериментируя с видео, я каждый раз возвращался в одну и ту же точку, в которой приходилось разбираться с видеокодеками. Мы сейчас находимся в этой точке, и лучше прояснить все с самого начала.
Снимаем кино
Зайдем на Rpi и сделаем маленький фильм командой
1 |
raspivid -o cam.h264 |
1 2 |
pi@cam ~ $ ls -l -rw-r--r-- 1 pi pi 10154858 Апр 5 15:12 cam.h264 |
В течении нескольких секунд на камере появится красный огонек, и потом появится файл cam.h264. Имя и расширение — совершенно произвольные. Я дал расширение h264 потому что утилита raspivid пишет в формате кодека h264.
Проверим, в каком формате прошла запись файла (повторю, расширение никакой роли не играет). Вначале очень полезной командой file:
1 2 |
pi@cam ~ $ file cam.h264 cam.h264: JVT NAL sequence, H.264 video @ L 40 |
Потом — более специализированной командой avprobe из состава медиабиблиотек libav:
1 2 3 4 5 6 7 |
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. Для этого перезайдем командой
1 |
legolas@bingo ~$ ssh -X pi@cam |
В результате сетевой адрес дисплея моего компьютера bingo (переменная окружения DISPLAY) будет экспортирован на машину cam и все графическое что я буду запускать на cam будет отображаться на bingo.
Теперь не терпится проиграть этот файл в плеере и посмотреть что сняла камера? Ничего не получится. Запустим mplayer cam.h264 и увидим одну ругань. В чем же дело?
Кодеки и контейнеры
Дело в том, что хотя файл содержит полную видеоинформацию о фильме, этого недостаточно. Данные кодека h264 должны быть помещены в контейнер. Контейнер — это нечто, позволяющее внешним программам работать с аудиоданными в упорядоченном режиме. Можно привести аналогию: кодек это куча песка, но чтобы его куда-то отвезти, нужен железнодорожный состав с вагонами. Продолжая аналогию, говорим о том, что вагоны — это фреймы которые содержат данные кодека.
Для того чтобы сформировать контейнер нам подойдет команда avconv. Она умеет много чего другого, в частности перекодировать видео и аудио с одного формата в другой. Но это нам не нужно: мы просто сохраняем кодек h264 и помещаем его в контейнер mp4. При желании, можно выбрать какой нибудь другой контейнер, например avi. Тип контейнера указывает ключ -f. Командная строка будет выглядеть так:
1 |
pi@cam ~ $ avconv -i cam.h264 -vcodec copy -f mp4 cam.mp4 |
Ключ -i указывает на входной файл, опция copy говорит о том что видеоданные перекодировать не нужно и они просто копируются в контейнер cam.mp4. В результате получаем контейнер с данными кодека:
1 2 3 4 5 |
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 Аналогично, смотрим что за файл получился: |
1 2 |
pi@cam ~ $ file cam.mp4 cam.mp4: ISO Media, MPEG v4 system, version 1 |
1 2 3 4 5 6 7 8 9 10 11 |
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 |
Заметим, что размер контейнера чуть больше чем размер файла кодека. Так и должно быть: вагоны тоже чего-то стоят.
Берем попкорн и садимся смотреть видео:
1 |
pi@cam ~ $ mplayer cam.mp4 |
Не забываем, что благодаря команде ssh -X смотрим видео не на Rpi, а на своей машине.
Здесь, справедливости ради, надо отметить, что мы смогли бы проиграть «чистый» файл cam.h264 и без контейнера. Для этого достаточно указать скорость поступления фреймов, которую плеер берет из контейнера:
1 |
pi@cam ~ $ mplayer -fps 25 cam.h264 |
Замечу, что поскольку в конечном счете нам нужен именно контейнер, то можно обойтись без промежуточного файла cam.h264:
1 |
raspivid -o - | avconv -i - -vcodec copy -f mp4 cam.mp4 |
Таким образом, различаем кодеки и контейнеры (в терминологии libav — форматы). Полезные команды:
узнать какие кодеки поддерживаются:
1 |
pi@cam ~ $ avconv -codecs |
узнать какие форматы (контейнеры) поддерживаются:
1 |
pi@cam ~ $ avconv -formats |
Дальше поговорим о том, как обеспечить live streaming — передачу видео по сети.
Продолжение в следующем номере:
Ответить