The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Создаем свой YouTube - Как обработать видео средствами веб-сервера (ffmpeg video stream flv mpeg 3gp)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: 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

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ RSS ]
 
  • 1.1, Krivoy, 08:38, 17/02/2010 [ответить] [смотреть все]
  • +/
    А причем тут YouTube?
    Название статьи замануха - контент боян! - -1
     
  • 1.2, andrey, 22:34, 17/02/2010 [ответить] [смотреть все]
  • +/
    Отличная статья. Автор толково расписал.
    отдельное спасибо за анимированное превью, искал как это сделать
     
  • 1.3, Григорий, 15:57, 17/05/2010 [ответить] [смотреть все]
  • +/
    Статья СУПЕР!
    Автору огромное спасибо!
     
  • 1.4, Владимир, 22:39, 13/01/2011 [ответить] [смотреть все]
  • +/
    Спасибо за статью, очень хорошо расписанно - очень пригодилось!!! Есть вопрос - есть ли какой нибудь параметр в php.ini что бы поменять размер (плеера?)показываемого видео через web-браузер а то на своем сайте загружаю файл допустим 800*600 а показывает в браузере mplayer максимум 300*250 ((( все стоит на системе  (ubuntu server 10.10)
     
  • 1.5, Dimedrius, 20:25, 20/06/2011 [ответить] [смотреть все]
  • +/
    To Владимир: что за глупость такая? Причем здесь php.ini? И какой такой mplayer в браузере? А по сути: настройки размера окна определяются в скрипте, запускающем плейер.
     
  • 1.6, Dimedrius, 20:27, 20/06/2011 [ответить] [смотреть все]  
  • +/
    Статья, кстати, сущая вода: всё перечисленное есть в манах. Хотя, не спорю, работа проделана немалая и новичку материал может пригодиться.
     
  • 1.7, Вова, 00:17, 10/05/2012 [ответить] [смотреть все]  
  • +/
    можно вопрос, так значит я могу запускать файл с расширением 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

     
  • 1.8, Barahten, 06:54, 24/02/2013 [ответить] [смотреть все]  
  • +/
    А где взять shared lgpl библиотеки? По ссылке их нету...
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:





      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor