5W site logo 5W - мой домашний сайт-блог с картинками, кино и плюшками.

ffmpeg-convert-video-for-html5.txt

кодирование видео для html5 с помощью ffmpeg

Здравствуйте. Сегодня я затрону тему, которая не самым прямым образом связана с разработкой на HTML5 и JavaScript, однако она должна быть интересна всем Вам. Сегодня мы поговорим о том, как кодировать видео на стороне сервера в форматы поддерживаемые современными браузерами и которые воспроизводятся в теге video и audio html 5. Для этих целей мы будем использовать ffmpeg с кодеками libx264, libvpx, libvorbis, libtheora, libmp3lame и libfaac. Я не смогу рассказать Вам как устанавливать эти кодеки, так как сам не умею этого делать, однако мы подробно рассмотрим как кодировать видео прямо из php.

введение
Как известно, в HTML5 теге video можно воспроизводить видео закодированные следующими кодеками: mpeg-4, H.264, Ogg Theora и WebM, а звук должен быть закодирован кодеками PCM, MP3, AAC, Ogg Vorbis или WebM. Соответственно расширения файлов могут быть примерно следующими: .mp4, .h264, .ogg, .ogv, .webm, .wav, .mp3, .aac, .oga.

Перед началом нам нужно разобраться какие кодеки нужно использовать для того или иного формата. Для этого рассмотрим небольшую таблицу:

Формат

Видео кодек

Аудио кодек

.mp4

Mpeg4, h264

Mp3

.h264

H264

Mp3

.ogg

Ogg Theora

Ogg Vorbis

.ogv

Ogg Theora

-

.webm

WebM

WebM, Ogg Vorbis

.wav

-

PCM

.mp3

-

MP3

.aac

-

AAC

.oga

-

Ogg Vorbis

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

В ffmpeg названия кодеков имеют следующие символьные обозначения:

Mp4

mpeg4

H264

libx264

Ogg Theora

libtheora

WebM

libvpx

PCM

pcm_s16le*

MP3

libmp3lame

AAC

libfaac

Ogg Vorbis

libvorbis

* - в стандартной комплектации ffmpeg есть множество разных кодеков PCM. Здесь приведен лишь один из них.

проверка наличия всех кодеков
Для того, чтобы посмотреть список поддерживаемых форматов и кодеков в ffmpeg необходимо подключиться к Вашему серверу по ssh. Это можно сделать напрямую в Linux, либо установив программу putty в Windows. Подключившись к серверу и войдя под своим логином, дайте команду ffmpeg. На выходе у Вас должна появится примерно такая строчка:

FFmpeg version 0.6.1, Copyright (c) 2000-2010 the FFmpeg developers



и после этого куча настроек ffmpeg. Они нас интересуют, так как мы просто убедились что ffmpeg установлен на Вашем сервере.

Теперь давайте посмотрим список кодеков, установленных в системе и которые доступны в ffmpeg. Делается это с помощью команды ffmpeg -codecs.

Вбив её, Вам высветится список всех доступных кодеков.



Буквенные обозначения слева обозначают может ли тот или иной кодек кодировать, или только декодировать. Нам понадобятся все вышеперечисленные кодеки: mpeg4, libx264, libtheora, libvorbis, libvpx, libmp3lame и libfaac. Найдите их в списке и убедитесь что около их названия присутствует буква E (Encoding). Если какого-то кодека не найдется, то кодирование этим кодеком будет невозможно.

Чтобы проверить поддерживаемые форматы, нужно ввести команду ffmpeg -formats:



Тут Вам нужно найти форматы mp4, webm, h264, ogg, aac, wav и mp3. Возле каждого из них должна стоять буква E. Заметим, что для кодирования видео и аудио в форматы oga и ogv используется компоновщик ogg, так что этих форматов Вы в списке не найдете.

Если Все кодеки и форматы установлены то можно приступить к самому главному - кодированию!

простейшая команда
Давайте рассмотрим простейшую команду в ffmpeg для кодирования видео в какой-нибудь формат:


ffmpeg -i /var/www/html/input.avi -f webm -vcodec libvpx -acodec libvorbis -b 600k -r 25 -s 320x240 -ar 44100 -ab 128k -ac 2 -y /var/www/html/output.webm

На первый взгляд команда кажется довольно сложно сложной, однако мы сейчас разберем каждый параметр:

-i - путь к исходному видео

-f - формат, в который нужно преобразовать выходной файл. Если этот параметр не указан, то ffmpeg пытается достать формат из пути к выходному файлу.

-vcodec - кодек, который необходимо использовать для кодирования видео. Здесь нам нужно указать кодек из таблицы соответствия названия кодеков и их обозначения в ffmpeg.

-acodec - кодек, который необходимо использовать для кодирования аудио. Здесь нам нужно указать кодек из таблицы соответствия названия кодеков и их обозначения в ffmpeg.

-b - битрейт видео.

-r - кодичество кадров в секунду в видео.

-s - разрешение выходного видео.

-ab - битрейт звука.

-ar - частота звука.

-ac - количество каналов звука в выходном файле.

-y - если указан этот атрибут то если выходной файл уже существует то он будет перезаписан.

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

Запустим эту команду, у Вас на сервере в папке /var/www/html появится файл output.webm

Этот файл можно использовать в теге video html5.

Аналогично производится кодировка в другие форматы. Вам нужно только подставлять нужный видео формат, звуковой и видео кодек. Важно заметить, что каждый формат поддерживает только определенный список кодеков. Например Вы не сможете закодировать видео в формате mpeg4 в файл webm.

вызов из php
Итак, мы научились кодировать видео на стороне сервера через putty. Теперь перед нами стоит задача запустить кодирование с помощью ffmpeg. Делается это очень просто. Используйте вот такую функцию:


function runExternal( $cmd, &$code ) {
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$pipes= array();
$process = proc_open($cmd, $descriptorspec, $pipes);
$output= "";
if (!is_resource($process)) return false;
fclose($pipes[0]);
stream_set_blocking($pipes[1],false);
stream_set_blocking($pipes[2],false);
$todo= array($pipes[1],$pipes[2]);
while( true ) {
$read= array();
if( !feof($pipes[1]) ) $read[]= $pipes[1];
if( !feof($pipes[2]) ) $read[]= $pipes[2];
if (!$read) break;
$ready= stream_select($read, $write=NULL, $ex= NULL, 2);
if ($ready === false) {
break;
}
foreach ($read as $r) {
$s= fread($r,1024);
$output.= $s;
}
}
fclose($pipes[1]);
fclose($pipes[2]);
$code= proc_close($process);
return $output;
}

Параметр $cmd в этой функции - строка вызова ffmpeg. Во второй параметр будет возвращен результат кодирования. Таким образом вызвав такую команду в php:


runExternal( " ffmpeg -i /var/www/html/input.avi -f ogg -vcodec libtheora -acodec libvorbis -b 600k -r 25 -s 320x240 -ar 44100 -ab 128k -ac 2 -y /var/www/html/output.ogg", &$code );

На выходе Вы получите видео в нужном Вам формате.

особенности тега video в разных браузерах
Разные браузеры по разным причинам поддерживают разные кодеки, поэтому разработчикам приходится кодировать видео сразу в несколько форматов. Чтобы Ваше видео гарантированно было воспроизведено во всех браузерах мы рекомендуем Вам хранить его в форматах webm, ogg и h.264.