Ключевые слова:ffmpeg, video, stream, flv, mpeg, 3gp, (найти похожие документы)
From: Александр Майоров
Date: Mon, 15 Feb 2010 17:02:14 +0000 (UTC)
Subject: Создаем свой YouTube - Как обработать видео средствами веб-сервера
Материал предоставлен редакцией журнала Системный администратор.
Опубликовано в журнале "Системный администратор" N 12 2009
Каждый веб-разработчик должен иметь представление о том, как можно
обработать видео средствами веб-сервера и автоматизировать
конвертирование из одного формата в другой
С чего начать?
Существует несколько инструментов для работы с видео, среди которых
наибольшее распространение получили Mencoder, Transcoder и FFmpeg.
Мы рассмотрим работу с FFmpeg, так как он наиболее удобен, является
кроссплатформенным и обладает всем необходимым функционалом для работы
с видео в WEB, а главное, у него есть API для удобной работы из языка
программирования PHP, поставляемый в виде расширения. Мощь данному
инструменту придает библиотека libavcodec. Родословные почти всех
открытых программ для работы с медиа восходят к этим двум компонентам.
Mencoder - часть медиаплеера Mplayer и DVD-риппера AcidRip. Transcode
используется в таком известном приложении, как dvd::rip. И Mencoder и
Transcode тоже основаны на использовании библиотеки libavcodec.
Немного слов о FFmpeg
FFmpeg - это набор библиотек с открытым исходным кодом, которые
позволяют работать (записывать, конвертировать и транслировать) аудио и
видео в различных форматах. Сам набор включает в себя следующие
компоненты:
* ffmpeg - утилита командной строки для конвертирования формата
видеофайла. С её помощью можно также захватывать видео в реальном
времени с TV-карты;
* ffserver - HTTP (RTSP в настоящее время разрабатывается) потоковый
сервер для видео/радиовещания;
* ffplay - простой медиаплеер, основанный на SDL и библиотеках FFmpeg;
* libavcodec - библиотека, в которой содержатся все аудио/видеокодеки.
Большинство кодеков были разработаны "с нуля" для обеспечения
наилучшей производительности;
* libavformat - библиотека мультиплексирования и демультиплексирования
в медиаконтейнер;
* libavutil - вспомогательная библиотека, содержащая стандартные,
общие подпрограммы для различных компонентов ffmpeg. Включает в себя:
adler32, crc, md5, sha1, lzo-декомпрессор, Base64-кодер/декодер,
des-шифратор/дешифратор rc4-шифратор/дешифратор и
aes-шифратор/дешифратор;
* libpostproc - библиотека, содержащая стандартные подпрограммы
обработки видео;
* libswscale - библиотека, предназначенная для масштабирования видео.
* libavfilter - является заменой vhook, которая позволяет изменять
видеопоток между энкодером и декодером на лету.
Название самого проекта FFmpeg происходит от названия экспертной группы
"MPEG" и "FF", означающего "fast forward". Данный проект основал
Фабрис Беллар (известный под псевдонимом "Gerard Lantau"). Фабрис
Беллар (фр. Fabrice Bellard) - французский программист, автор ряда
известных проектов в сфере свободного программного обеспечения,
к примеру, таких как: QEMU (свободная программа для эмуляции
аппаратного обеспечения различных платформ с открытым исходным кодом),
Tiny C Compiler (компактный компилятор C). В настоящее время проект
поддерживает Митчел Недермайер (Michael Niedermayer). Многие
разработчики FFmpeg работают над проектом Mplayer. Кстати, сам FFmpeg
располагается на сервере Mplayer.
FFmpeg разработан под операционные системы на основе GNU/Linux, однако
может быть портирован и под многие другие ОС, в том числе и Windows.
Разработчики не выпускают релизов и рекомендуют использовать последний
снимок из Subversion. Распространяется FFmpeg под открытыми лицензиями
GNU LGPL или GNU GPL.
FFmpeg работает со следующими кодеками:
* ATRAC3.
* H.261, H.263 и H.264.
* Intel Indeo 2 и 3.
* QDesign Music Codec 2, используемый в QuickTime до QuickTime 7.
* Sorenson 3 Codec используемый в QuickTime.
* Theora (вместе с Vorbis используется в контейнере Ogg).
* Truespeech.
* TXD.
* VP5 и VP6.
* Vorbis.
* Windows Media Audio.
* Некоторые Windows Media Video-кодеки, включая WMV1, WMV2 и WMV3.
Форматы, которые поддерживает FFmpeg:
* ASF, и через него оригинальную версию DivX.
* AVI.
* FLV.
* Matroska.
* MPEG transport stream.
* TXD.
Для веб-разработчиков на PHP к FFmpeg было написано расширение
ffmpeg-php. Данное расширение добавляет удобный
объектно-ориентированный программный интерфейс для работы с видео и
аудио посредством аfmpeg.
Первые шаги
Прежде чем приступить к работе с FFmpeg, для начала его надо
установить. В зависимости от вашей ОС, установка, естественно, будет
отличаться. Если у вас операционная система семейства GNU/Linux, то,
скорее всего, вы будете устанавливать его из репозитория, через
встроенный менеджер пакетов. Это самый лучший вариант, так как FFmpeg
имеет очень много зависимостей, которые легко удовлетворяются
менеджером пакетов в автоматическом режиме. Если у вас, к примеру,
openSUSE, то вы воспользуетесь YaST'ом, если Ubuntu или Debian-подобный
дистрибутив, то вы, скорее всего, будете ставить его через apt. Если у
вас FreeBSD, то лучше воспользоваться системой портеджей. Во FreeBSD
FFmpeg находится в /usr/ports/multimedia/ffmpeg. Далее выполняете
стандартные команды конфигурации и сборки "make config && make
configure && make && make install && make clean", после чего у вас
будет собран и установлен FFmpeg из репозитория.
Надо заметить, что не все так просто. Многие кодеки имеют не полностью
свободные лицензии. В силу этого, как правило, FFmpeg приходится
скачивать со сторонних (не дистрибутивных) репозиториев. Например, для
того же openSUSE с Packman. Там же и для Fedora, RedHut, CentOS. А это
значит, что надо настраивать дополнительно yast/apt/yum/zypper в
зависимости от вашей операционной системы.
Если все сделано правильно, то, набрав в консоли команду:
ffmpeg -v
вы должны получить сведения о версии программы и опциях сборки. Это
может выглядеть примерно так:
FFmpeg version SVN-r20024, Copyright (c) 2000-2009
Fabrice Bellard, et al.
configuration: --shlibdir=/usr/lib64 --prefix=/usr
--mandir=/usr/share/man --libdir=/usr/lib64 --enable-shared
--enable-libmp3lame --enable-libvorbis --enable-libtheora
--enable-libspeex --enable-libfaad --enable-libfaac
--enable-nonfree --enable-libxvid --enable-postproc
--enable-gpl --enable-x11grab --enable-libschroedinger
--enable-libdirac --enable-libgsm --enable-version3
--enable-libopencore-amrnb --enable-libopencore-amrwb
--enable-libx264 --enable-libdc1394 --enable-pthreads
libavutil 50. 3. 0 / 50. 3. 0
libavcodec 52.35. 0 / 52.35. 0
libavformat 52.38. 0 / 52.38. 0
libavdevice 52. 2. 0 / 52. 2. 0
libswscale 0. 7. 1 / 0. 7. 1
libpostproc 51. 2. 0 / 51. 2. 0
built on Sep 27 2009 15:47:36, gcc: 4.3.2
[gcc-4_3-branch revision 141291]
Как уже было сказано выше, для PHP-программистов существует удобный API
для работы с FFmpeg, но это не значит, что работать с ним можно только
через данную библиотеку. В жизни бывает так, что на целевом сервере у
клиента нет возможности доставить нужные расширения для PHP и что-то
переконфигурировать. Но там может стоять FFmpeg как системная утилита,
доступная из консоли. Не стоит забывать, что ffmpeg-php - это всего
лишь удобная обертка над консольной версией программы, поэтому нам
ничто не мешает в наших программах обращаться напрямую к FFmpeg через
системные вызовы. Работать в консоли с ffmpeg достаточно несложно,
нужно просто знать заветные ключики и параметры. Итак, приступим.
Для начала определимся, что мы хотим получить и ради чего будем всем
этим заниматься. Допустим, у нас есть большое желание сделать сервис,
аналогичный YouTube и ему подобным. Ориентируясь на современные
потребности и возможности технологий, наш сервис будет доступен не
только для обычных персональных компьютеров, но и для мобильных
телефонов. В "большом вебе" мы будем отдавать видео для просмотра в
формате FLV, что позволит пользователю смотреть видео прямо в браузере.
Для других устройств, в частности, мобильных телефонов, мы будем
отдавать видео в формате 3GP. Так же у нас будет задача делать для всех
загружаемых видеороликов превью и с последующим брендированием как
самих превью файлов, так и загруженного видео. Собственно, с целями
определились, теперь приступим к реализации нашего технического
задания.
Начнем с полезных команд. Чтобы получить информацию о файле, достаточно
его просто передать на вход программы. Входной файл задается ключом -i
(от слова input):
ffmpeg -i 1.3gp
Вывод данной команды будет примерно таким (здесь опущена информация о
версии FFmpeg):
Seems stream 0 codec frame rate differs from container
frame rate: 30060.00 (30060/1) -> 29.98 (45000/1501)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.3gp':
Duration: 00:01:00.00, start: 0.000000, bitrate: 137 kb/s
Stream #0.0(eng): Video: mpeg4, yuv420p, 176x144
[PAR 1:1 DAR 11:9], 29.98 tbr, 90k tbn, 30060 tbc
Stream #0.1(eng): Audio: libopencore_amrnb, 8000 Hz,
1 channels, s16
Metadata
muxer : avc2.0.11.1110
muxer-jpn : avc2.0.11.1110
At least one output file must be specified
Как правило, самый распространенный формат для загрузки на сервер - это
AVI. Нам же надо будет еще иметь, соответственно, FLV, MP4 и 3GP, к
примеру.
FLV-конвертирование
Формат FLV предназначен для потокового видео, однако существует
возможность использовать его и для локального хранения и
воспроизведения видео. FLV используется в Adobe Flash Player, который
распространяется в качестве плагина для различных браузеров и
операционных систем. Формат поддерживается многими
мультимедиапроигрывателями, такими как FFmpeg и Mplayer. Так как FLV -
это медиа-контейнер, а не формат, некоторые проигрыватели могут
некорректно воспроизводить видео или звуковой поток при отсутствии
кодеков, использованных при создании файла. FLV-формат частично
проприетарный. Кодеки закрыты и защищены патентами, а сам контейнер
открытый. FLV-файл представляет собой битовый поток, являющийся
вариантом видеостандарта H.263. Это стандарт сжатия видео,
предназначенный для передачи по каналам с низкой пропускной
способностью (128 кбит/с и ниже).
Звук в FLV, как правило, закодирован в MP3. Но иногда могут
использоваться Nellymoser codec, несжатое аудио или ADPCM-аудиоформат.
В версии Flash Player 9 Update 3, в соответствии с внедрением Adobe
формата ISO Base (MPEG-4 Part 12), добавлена поддержка AAC-аудио
(профили AAC-LC, Main Profile и HE-AAC).
В общих чертах организация собственного видеохостинга происходит
следующим образом: пользователь закачивает на сервер исходный файл, на
сервере происходит его перекодирование в нужный формат, создается
превью, которое в дальнейшем используется как заставка и
минимизированная картинка. Исходный файл по желанию сохраняется или
удаляется ради экономии дискового пространства.
Теперь переходим плавно от теории к практике. Чтобы сконвертировать
AVI-файл в FLV-формат, достаточно вызвать FFmpeg таким образом:
ffmpeg -i uploaded_file.avi output_file.flv
В результате наших действий мы получим FLV-версию файла. Если мы хотим
задать битрейт, то надо указать параметр "-b bitrate" - битрейт,
параметр, определяющий качество, по умолчанию 200 кбит/с. К примеру:
"-b 512k" означает, что задано качество в 512 кбит/с.
Также может быть полезной опция "-t duration" - продолжительность
проигрывания и "-ss start_pos" - смещение от начала исходного
видеофрагмента (можно задать как количество секунд, так и время в
формате ЧЧ:ММ:СС.Д).
FFmpeg умеет по расширению имени выходного файла (output_file)
определять параметры кодирования для этого файла (аудио/видео кодеки и
прочее), так что обычно не приходится указывать их вручную при помощи
соответствующих опций. Допустим, мы хотим для мобильной версии сайта
оптимизировать файлы и убирать первые несколько секунд ролика, которые,
как правило, не несут смысловой нагрузки.
ffmpeg -i uploaded_file.avi -ss 00:00:16.0 -b 512k output_file.flv
Этой командой мы отрезаем первые 16 секунд ролика и задаем битрейт в
512 кбит/с.
3GP-конвертирование
3GP (сокращение от англ. 3rd generation (mobile) phone) - это
видеофайлы для мобильных телефонов третьего поколения. Некоторые
современные мобильные телефоны (не обязательно 3G) имеют функции записи
и просмотра аудио и видео в формате 3GP. Этот формат - упрощённая
версия ISO 14496-1 Media Format, который похож на MOV, используемый
QuickTime. 3GP сохраняет видео как MPEG-4 или H.263. Аудио сохраняется
в форматах AMR-NB или AAC-LC. Готовые видеоролики в формате имеют малый
размер по сравнению с другими форматами видео, но, к сожалению, за счет
жертвы качеством.
Чтобы произвести конвертацию файла в формат 3GP, нужно проделать почти
то же самое, что и с конвертацией файла в FLV-формат, но только задать
соответствующее расширение выходного файла и дополнительные настройки
кодеков. Наша команда в консоли будет выглядеть так:
ffmpeg -i inputfile.avi -s qcif -vcodec h263 -acodec aac -ac 1 -ar 8000 \
-r 25 -ab 32 -y outputfile.3gp
Вы можете не хранить оригинальный AVI-файл, но, если вдруг вам
понадобится этот формат, вот пример обратного преобразования:
ffmpeg -i input_clip.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 output_file.avi
Правда, надо заметить, что сжатие было с потерей качества изначально,
поэтому мы получим файл в формате AVI, но качество будет таким как у
3GP.
Кодирование в MPEG-4
MPEG-4 - это международный стандарт, используемый преимущественно для
сжатия цифрового аудио и видео. Он появился в 1998 году и включает в
себя группу стандартов сжатия аудио и видео и смежные технологии,
одобренные ISO - Международной организацией по стандартизации/IEC
Moving Picture Experts Group (MPEG). Стандарт MPEG-4 в основном
используется для вещания (потоковое видео), записи фильмов на
компакт-диски, видеотелефонии (видеотелефон) и широковещания, в которых
активно используется сжатие цифровых видео и звука.
MPEG-4 включает в себя многие функции MPEG-1, MPEG-2 и других подобных
стандартов, добавляя такие функции, как поддержка языка виртуальной
разметки VRML для показа 3D-объектов, объектно-ориентированные файлы,
поддержка управления правами и разные типы интерактивного медиа. AAC
(Advanced Audio Codec - или улучшенный аудиокодек) был стандартизован
как дополнение к MPEG-2 (часть 7), был также расширен и включен в
MPEG-4.
MPEG-4 всё ещё находится на стадии разработки и делится на несколько
частей. Ключевыми частями стандарта MPEG-4 являются часть 2 (MPEG-4
part 2, включая Advanced Simple Profile, используемый такими кодеками
как DivX, Xvid, Nero Digital и 3ivx, а также Quicktime 6) и часть 10
(MPEG-4 part 10/MPEG-4 AVC/H.264 или Advanced Video Coding,
используемый такими кодеками как x264, Nero Digital AVC, Quicktime 7, а
также используемый в форматах DVD следующего поколения, таких как HD
DVD и Blu-ray Disc). MPEG-4 Part 10 имеет обозначение H.264. Данный
формат предназначен для достижения высокой степени сжатия видеопотока
при сохранении высокого качества. Соответственно, кодирование в H.264
будет осуществляться следующим образом:
ffmpeg -i input_file.avi -vcodec h264 -threads 0 -r 25 -g 50 -b 500k \
-bt 500k -acodec mp3 -ar 44100 -ab 64k out_file.mp4
Вытаскиваем саундтрек из фильма
Возможно, вы захотите позволить пользователям своего сервиса скачивать
саундтреки из фильмов или просто аудиодорожки. Как это сделать? С
FFmpeg проще простого. Для начала надо получить сведения о файле и
определить параметры звуковой дорожки. Допустим, у нас есть видеофайл.
Мы узнаем с помощью FFmpeg формат кодирования звука в требуемом файле.
К примеру, звук в нашем файле идентифицируется как:
Stream #0.1:Audio: mp3, 44100Hz, stereo, s16, 80kb/s
Теперь у нас достаточно информации для извлечения звука из видеоролика.
Мы просто пишем в консоли:
ffmpeg -i input_file.flv -vn -acodec copy soundtrack.mp3
Флаг -vn указывает на то, что мы не хотим работать с видео и оно нам не
нужно. Команда copy указывает нашему FFmpeg на то, что следует
кодировать выходной файл тем же самым кодеком, которым он
раскодируется. По желанию вы можете изменить частоту дискретизации и
битрейт.
FFmpeg также позволяет извлекать аудио из AVI с высоким качеством
звуковой дорожки для записи, к примеру, на аудио-CD-носитель. Пример
извлечения такой дорожки:
ffmpeg -i input_file.avi -vn -acodec pcm_s16le -ar 44100 -ac 2 output_file.wav
Таким образом будет получена несжатая двухканальная аудиозапись с
частотой дискретизации 44100 Гц и 16-битным качеством.
Контроль над содержимым
Допустим, у вас сервис получил свое развитие и вы стали популярны. К
вам "льют" видеоролики в больших количествах, но при этом ваш сервис
ориентирован на детскую аудиторию, к примеру. Вы сами решите, как
применять полученные знания на практике. Итак, у нас кто-то залил
мультфильм про Винни Пуха, но со своей версией озвучивания, содержащей
нецензурные выражения и прочие недетские высказывания.
Вы, при модерации можете вырезать звук из данного ролика, оставив тем
самым его без аудиодорожки, сообщив автору контента, что на вашем сайте
запрещены ролики с ненормативной лексикой, и вы просите его перезалить
с нормальным содержанием, либо ролик так и останется без
аудиосодержимого. Чтобы проделать такую операцию, достаточно выполнить
команду вида:
ffmpeg -i input_censored_file.flv -an -vcodec copy output_censored_file.flv
Параметр -an аналогичен параметру -vn, только указывает на то, что мы
не хотим обрабатывать звук.
Делаем превью для видео
Как мы уже говорили, на сайте нужно еще показать превью - маленькое
изображение кадра, чтобы заинтересовать посетителя и дать
предварительную информацию о содержимом. Все это также умеет делать
FFmpeg. Достаточно указать ему, что мы хотим вытащить кадр и указать
формат, в котором мы хотим сохранить его.
ffmpeg -i video_input_file.flv -an -ss 30 -vframes 1 -s 340.180 -y -f mjpeg screenshot.jpg
Таким образом, мы создали графический файл в формате JPEG, взяв кадр на
30-й секунде.
Если нам надо сделать анимированное превью в формате GIF, то достаточно
указать количество кадров, количество цветов и формат выходного файла:
ffmpeg -i input_file.avi -an -pix_fmt rgb24 -ss 40 -vframes 64 -s 128.128 \
-loop_output 0 -f gif -y screenshot.gif
Обратите внимание на -loop_output - это количество повторов. Если его
не указать, то он будет по дефолту равен единице. Если указать ноль, то
анимация будет бесконечной.
Если вы хотите узнать больше информации о ключах и параметрах FFmpeg,
то вам достаточно набрать в консоли команду:
ffmpeg -h
либо пройтись по ссылке http://itbroadcastanddigitalcinema.com/ffmpeg_howto.html , где дана
подробная расшифровка всего справочного материала.
Собираем ffmpeg-php под *nix
Сначала загружаем само расширение для PHP с сайта:
http://sourceforge.net/projects/ffmpeg-php/files/ffmpeg-php
Установка в принципе не составит особого труда. Распаковываем архив с
исходными файлами командой:
tar -xjf ffmpeg-php.tbz2
Далее в директории с расширением запускаем утилиту phpize (входит в
дистрибутив PHP) для сборки конфигурационного файла. Если у вас нет
утилиты phpize, то вы можете установить пакет php-devel через ваш
менеджер пакетов либо скачать и установить PHP с официального сайта.
$ cd ffmpeg-php/
$ phpize
Далее конфигурируем и собираем расширение:
$ ./configure && make
$ sudo make install
После сборки получаем библиотеку ffmpeg.so (для ОС Windows это будет
ffmpeg.dll). Ее нужно вписать в php.ini с помощью директивы extension.
Проверить, подключен ли ffmpeg-php, можно несколькими способами.
Например, посмотреть в phpinfo информацию о расширении. Если оно
подключено, то вы увидите примерно следующее (см. рис. 2).
Если вы пишете консольную версию программы, то проверить информацию о
ffmpeg-php можно и в консоли:
$ php -i | grep ffmpeg
Возможные проблемы
Не всегда сборка программного обеспечения проходит гладко. Бывают и
проблемы. Я опишу два наиболее распространенных случая, которые
случались в моей практике, и пути их решения. Один из вариантов ошибок
приведен ниже:
/home/0xfa/ffmpeg-php/ffmpeg-php.c -fPIC -DPIC -o .libs/ffmpeg-php.o
In file included from /home/0xfa/ffmpeg-php-0.6.0/ffmpeg-php.c:42:
/usr/local/include/ffmpeg/avcodec.h:30:30: error: libavutil/avutil.h:
No such file or directory
/usr/local/include/ffmpeg/avcodec.h:262:5: error: missing binary
operator before token "("
/usr/local/include/ffmpeg/avcodec.h:323:5: error: missing binary
operator before token "("
/usr/local/include/ffmpeg/avcodec.h:436:5: error: missing binary
operator before token "("
/usr/local/include/ffmpeg/avcodec.h:442:5: error: missing binary
operator before token "("
In file included from /home/0xfa/ffmpeg-php-0.6.0/ffmpeg-php.c:42:
/usr/local/include/ffmpeg/avcodec.h:817: error: expected ':', ',', ';',
'}' or '__attribute__' before '*' token
У меня данная проблема встречалась на FreeBSD. При сборке FFmpeg не мог
найти нужных заголовочных файлов. Данную проблему я решил тем, что
скопировал /usr/local/include/libavutil в
/usr/local/include/ffmpeg/libavutil.
Еще один распространенный случай:
Exit with error ... /ffmpeg-php/ffmpeg_frame.c:498: error:
`PIX_FMT_RGBA32` undeclared (first use in this function) ...
Лечится это правкой исходных файлов. Достаточно открыть файл
ffmpeg_frame.c и сделать в нем исправления, а именно - заменить
PIX_FMT_RGBA32 на PIX_FMT_RGB32. Сохраняем и пересобираем. Все должно
пройти гладко.
Установка ffmpeg-php под ОС Windows
Если у вас операционная система Windows, то сборка будет немного
сложнее, как это ни странно. Скорее всего я просто так привык к
UNIX-подобным системам и отвык от Windows, что мне кажется это немного
сложнее. Итак, у меня стоит операционная система Windows XP SP2. Чтобы
собрать библиотеку, понадобится Microsoft Visual Studio 2005 Express
Edition, которую можно взять отсюда http://www.microsoft.com/express/2005/download/default.aspx
Также нужно установить Microsoft Platform SDK, который забираем отсюда
http://www.microsoft.com/downloads/details.aspx?familyid=0baf2b35-c656-4969-ace8-e4c0c0716adb.
Еще потребуются LGPL Shared-библиотеки и заголовочные файлы FFmpeg для
Windows. Их можно взять по этой ссылке http://ffmpeg.arrozcru.org/builds
Далее нам потребуются заголовочные файлы inttype.h и stdint.h, которые
можно взять здесь:
* http://msinttypes.googlecode.com/svn/trunk/inttypes.h.
* http://msinttypes.googlecode.com/svn/trunk/stdint.h.
Создайте директорию, в которой будут размещаться все необходимые файлы.
У меня это C:\dev\php\ffmpeg. Распакуйте туда исходные коды PHP и
ffmpeg-php, все библиотеки и заголовочные файлы.
Создайте новый проект в студии, задав тип проекта - Win32, шаблон -
Win32 Project. Также скопируйте файлы из папки
ffmpeg-lgpl-lshared-win32\dll и файл pthreadGC2.dll в папку system32. В
качестве места расположения укажите созданную ранее директорию. В окне
Application Wizard перейдите на вкладку Application Settings и
установите тип приложения DLL, а Additional Options выставте в Empty
Project. Жмите Finish, чтобы завершить создание проекта.
В окне Solution Explorer добавьте в раздел Header Files заголовочные
файлы ffmpeg-php:
ffmpeg_animated_gif.h;
ffmpeg_frame.h;
ffmpeg_movie.h;
gd.h;
gd_io.h;
php_ffmpeg.h.
В раздел Source Files добавьте файлы исходных кодов ffmpeg-php:
ffmpeg_animated_gif.c;
ffmpeg_errorhandler.c;
ffmpeg_frame.c;
ffmpeg_movie.c;
ffmpeg_php.c.
Приступим к конфигурированию проекта. Откройте меню Project и выберите
пункт Properties. Перед вами появится окно настройки проекта. Откройте
вкладку Configuration Properties. Выберите конфигурацию - Release.
Перейдите на вкладку General, вкладкиC/C++. В поле Additional Include
Directories добавьте следующие пути:
C:\dev\php\ffmpeg;
C:\dev\php\ffmpeg\php5;
C:\dev\php\ffmpeg\php5\TSRM;
C:\dev\php\ffmpeg\php5\Zend;
C:\dev\php\ffmpeg\php5\main;
C:\dev\php\ffmpeg\ffmpeg-include\include\ffmpeg;
C:\Program Files\Microsoft Platform SDK\Include.
Перейдите на вкладку C/C++, раздел Preprocessor, и в поле Preprocessor
Definitions добавьте следующие строки:
PHP_WIN32
ZEND_WIN32
ZTS=1
ZEND_DEBUG=0
HAVE_LIBGD20=1
COMPILE_DL_FFMPEG
Затем перейдите на вкладку Linker, далее в General. В Additional
Library Directories добавьте два пути:
С:\dev\php\ffmpeg\php5-Win32\dev;
C:\dev\php\ffmpeg\ffmpeg-lgpl-lshared-win32\lib.
Далее перейдите на вкладку Linker, в Input и введите в поле Additional
Dependencies:
php5ts.lib;
avcodec-51.lib;
avformat-51.lib;
avutil-49.lib.
Затем на вкладке Linker, в Command Line и в поле Additional options
добавьте:
/FORCE:MULTIPLE
Перейдите на вкладку Linker, в General. В поле Output File введите:
$(OutDir)\ffmpeg.dll
Прежде чем собирать проект, нужно сделать еще пару исправлений, а
именно - в файле ffmpeg-php\ffmpeg_frame.c найдите следующую строку:
#include "config.h"
и замените её на следующую запись:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
Попробуйте собрать все это, нажав клавишу <F7>. Если в консоли появится
сообщение об ошибке:
error C2466: cannot allocate an array of constant size 0
то откройте файл php\main\config.w32.h и закомментируйте строку:
#define _USE_32BIT_TIME_T 1
Попробуйте собрать расширение. На выходе должен получиться наш файл
библиотеки ffmpeg\release\ffmpeg.dll. Этот файл нужно скопировать в
папку с расширениями PHP и добавить в php.ini строку:
extension=php_ffmpeg.dll
На этом процесс сборки и установки расширения можно считать
законченным.
Работаем с FFmpeg в PHP
Теперь приступим к программированию. Опираясь на полученные знания,
весь ваш скрипт для работы с видео может уложиться в одну строку, а
именно:
<?php
system($cmd);
?>
Где $cmd - это одна из консольных команд, что мы рассматривали выше.
Так можно описать все нужные вам вызовы. Но это бывает не очень удобно
для некоторых задач. Удобнее всего работать с оберткой, которая
выполнена в виде расширения PHP и позволяет избавиться от вызова
системных команд через консоль.
Для правильной работы ffmpeg-php необходима библиотека GD, которая
позволяет работать с графическими файлами различных форматов. GD - это
библиотека для динамической работы с изображениями. Она позволяет
создавать изображения в форматах GIF, JPEG, PNG и WBMP. Название GD
изначально обозначало "GIF Draw". Однако после аннулирования лицензии
Unisys, аббревиатура расшифровывается как "Graphics Draw". GD
позволяет создавать изображения, состоящие из линий, дуг, текста
(включая программный выбор шрифтов) и других изображений, а также
использовать различные цвета. C версии 2.0 добавлена поддержка
32-битных (truecolor) изображений, альфа-каналов, дискретизация
изображений (для плавного изменения размера 32-битных изображений) и
многое другое. GD поддерживает множество языков программирования, в том
числе и PHP, где библиотека значительно расширена. Начиная с версии PHP
4.3, входит в стандартную поставку интерпретатора. До этой версии могла
подключаться как отдельная библиотека.
Ffmpeg-php оперирует с тремя типами объектов, а именно:
ffmpeg_movie;
ffmpeg_frame;
ffmpeg_animated_gif.
Рассмотрим подробнее работу с ffmpeg_vovie. Чтобы создать объект
данного типа, достаточно инициализировать его следующим образом:
$FfmpegMovie = new ffmpeg_movie(String path_to_media, boolean persistent);
Данный код открывает аудио или видеофайл и возвращает объект. В
качестве аргументов конструктора передаются: path_to_media - путь к
аудио- или видеофайлу и persistent - открыть как постоянный ресурс. О
постоянных ресурсах читайте в документации по PHP. После того, как
будет создан объект, вам будут доступны методы для работы, которые
описаны ниже.
Методы объекта ffmpeg_movie
Продолжительность аудио или видео:
$FfmpegMovie->getDuration();
Возвратит продолжительность файла в секундах.
Количество кадров:
$FfmpegMovie->getFrameCount();
Возвратит количество фреймов аудио- или видеофайла.
Частота кадров:
$FfmpegMovie->getFrameRate();
Возвратит частоту кадров видео в кадрах в секунду (fps - frame per
second)
Путь к файлу:
$FfmpegMovie->getFilename();
Возвратит путь к видео- или аудиофайлу.
Поле комментария:
$FfmpegMovie->getComment();
Возвратит поле комментария из аудио- или видеофайла.
Поле заголовка:
$FfmpegMovie->getTitle();
Возвратит поле заголовка из аудио- или видеофайла.
Высота видео:
$FfmpegMovie->getFrameHeight();
Возвратит высоту видео в пикселях.
Ширина видео:
$FfmpegMovie->getFrameWidth();
Возвратит ширину видео в пикселях.
Скорость потока аудио:
$FfmpegMovie->getAudioBitRate();
Возвратит битрейт аудио у видео- или аудиофайла в битах в секунду.
Номер кадра:
$FfmpegMovie->getFrameNumber();
Возвратит текущий номер кадра.
Название видеокодека:
$FfmpegMovie->getVideoCodec();
Возвратит название видеокодека, который использован в видеофайле, как
строку.
Название аудиокодека:
$FfmpegMovie->getAudioCodec();
Возвратит название аудиокодека, который использован видеофайл как
строку.
Количество аудиоканалов:
$FfmpegMovie->getAudioChannels();
Возвратит количество аудиоканалов как целое число. Если 1 - это моно,
если 2 - стерео, и т.д.
Кадр из видео:
$FfmpegMovie->getFrame([Integer framenumber]);
Возвратит кадр из видео как ffmpeg_frame объект. Возвратит логическую
ложь (false), если кадра нет, а framenumber - это номер кадра, который
надо возвратить. Если framenumber не определен, то возвращается
следующий кадр из видео.
Методы объекта ffmpeg_frame
Теперь рассмотрим работу с ffmpeg_frame. Чтобы создать объект данного
типа, достаточно инициализировать его следующим образом:
$Frame = new ffmpeg_frame(Resource gd_image);
Данный объект создается из ресурса GD либо возвращается некоторыми
методами объекта ffmpeg_movie.
$Frame->getWidth();
Возвратит ширину кадра.
$Frame->getHeight();
Возвратит высоту кадра.
$Frame->resize(Integer width, Integer height [, Integer crop_top [,
Integer crop_bottom [, Integercrop_left [, Integer crop_right ]]]]);
Изменяет размер и обрезает кадр. Параметры:
width - новая ширина кадра (должно быть натуральным числом);
height - новая высота кадра (должно быть натуральным числом);
croptop - удалить указанное количество рядов пикселов сверху кадра;
cropbottom - удалить указанное количество рядов пикселов снизу кадра;
cropleft - удалить указанное количество рядов пикселов слева от кадра;
cropright - удалить указанное количество рядов пикселов справа от кадра.
Обрезание всегда происходит до изменения размера кадра. Значения
параметров должны быть натуральными числами!
$Frame->crop(Integer crop_top [, Integer crop_bottom [, Integer
crop_left [, Integer crop_right ]]]);
Обрезать кадр. Параметры:
croptop - удалить указанное количество рядов пикселов сверху кадра;
cropbottom - удалить указанное количество рядов пикселов снизу кадра;
cropleft - удалить указанное количество рядов пикселов слева от кадра;
cropright - удалить указанное количество рядов пикселов справа от кадра.
Замечание: параметры должны быть натуральными числами.
$Frame->toGDImage();
Возвращает truecolor GD картинку (ресурс) кадра. Функция недоступна,
если нет библиотеки GD.
$Frame->addFrame(ffmpeg_frame frame_to_add);
Добавляет кадр в конец анимированного GIF. Параметры:
frame_to_add - ffmpeg_frame-объект для добавления в конец анимированного GIF.
$Frame->getPresentationTimestamp();
Возвращает время создания кадра.
Осталось рассмотреть последний тип объекта, это ffmpeg_animated_gif.
Методы объекта ffmpeg_animated_gif
Чтобы создать объект, не потребуется много усилий:
$GifFile = new ffmpeg_animated_gif(String output_file_path, Integer
width, Integer height, Integer frame_rate, [Integer loop_count])
Данный код создает новый ffmpeg_animated_gif-объект. Параметры, которые
нужно передать:
output_file_path - путь в файловой системе, куда будет записан анимированный GIF;
width - ширина анимированного GIF;
height - высота анимированного GIF;
frame_rate - частота кадров анимированного GIF в кадрах в секунду;
loop_count - количество повторений анимации. Укажите 0 для
бесконечного повторения или пропустите параметр для отключения
повторений.
$frame->addFrame(ffmpeg_frame frame_to_add);
Добавляет кадр в конец анимированного файла.
frame_to_add - ffmpeg_frame-объект для добавления в конец
анимированного файла.
Теперь можно рассмотреть небольшой пример создания превью с помощью
ffmpeg-php:
<?php
if ( $Ffmpeg = new ffmpeg_movie( $input_file ) )
{
if ( $Frame = $ffmpeg->getFrame($number_of_frame ) )
{
imagejpeg
(
$Frame->toGDImage(),
$path_to_image_file,
$quality
);
}
}
?>
В данном примере мы создаем объект ffmpeg_movie, затем получаем кадр с
помощью метода getFrame(), и если он существует, то сохраняем его с
помощью GD в JPG-формат, передав кадр в функцию imagejpeg()
предварительно превратив его в ресурс GD через метод toGDImage().
Конфигурирование сервера для нашего веб-хостинга
Видеофайлы достаточно объемные, поэтому, чтобы обеспечить возможность
загрузки больших файлов на сервер, нужно дополнительно сконфигурировать
PHP. В глобальном файле php.ini необходимо указать следующие параметры:
Post_max_size - максимально допустимый размер POST-данных (в
мегабайтах). Допустим, мы разрешаем загружать файлы размером 256 Мб,
для этого мы пишем:
post_max_size=256M
Но данного параметра недостаточно. Также надо указать
upload_max_filesize - максимальный размер закачиваемого файла. Данный
параметр должен быть равен post_max_size.
Так как загрузка файла и обработка файлов будут занимать достаточное
количество времени, следует дополнительно в скриптах через ini_set
указать max_execution_time - максимальное разрешенное время выполнения
скрипта (в секундах). Делается это так:
ini_set('max_execution_time', 9000);
Также надо выставить max_input_time - максимально разрешенное время (в
секундах), в течение которого скрипту разрешается анализировать входные
данные. Я выставил в 9000 секунд данный параметр.
Все эти параметры можно также указать через файл .htaccess для каждого
корня документов или даже директории вместо изменения глобального
php.ini. Делается это следующим образом:
php_value post_max_size 256M
php_value upload_max_filesize 256M
php_value max_execution_time 9000
php_value max_input_time 9000
В следующей статье. Мы рассмотрим с вами, как делать брендирование
файлов несколькими способами, изучим способы оптимизации и снижения
нагрузки.
1. http://ffmpeg-php.sourceforge.net
2. http://ffmpeg-php.sourceforge.net/doc/api
3. http://itbroadcastanddigitalcinema.com/ffmpeg_howto.html
4. http://ffmpeg.mplayerhq.hu/ffmpeg-doc.html
Спасибо за статью, очень хорошо расписанно - очень пригодилось!!! Есть вопрос - есть ли какой нибудь параметр в php.ini что бы поменять размер (плеера?)показываемого видео через web-браузер а то на своем сайте загружаю файл допустим 800*600 а показывает в браузере mplayer максимум 300*250 ((( все стоит на системе (ubuntu server 10.10)
To Владимир: что за глупость такая? Причем здесь php.ini? И какой такой mplayer в браузере? А по сути: настройки размера окна определяются в скрипте, запускающем плейер.
можно вопрос, так значит я могу запускать файл с расширением php и делать такой код как
<?php
system($ffmpeg -i input_file)
?>
ili po drugomu eto delaetsya? ob'yasni kak proshu,mne imenno cherez konsolnuyu stroku nujno sdelat takie veschi kak vvod i vyvod, i esche esli ya system pomeschu v peremenuyu i vyvedu eye na ekran,t.e
<?php
$con=system($ffmpeg -i input_file)
escho $con
?>
on u menya vyvodit vsyu informatsyyu o fayle????
proshu pomogite razobratsya,budu ochen preznatelen