Создаем свой YouTube. Как обработать видео средствами веб-сервера::Журнал СА 12.2009
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
О журнале
Журнал «БИТ»
Информация для ВАК
Звезды «СА»
Подписка
Где купить
Авторам
Рекламодателям
Магазин
Архив номеров
Вакансии
Игры
Контакты
   

  Опросы

Какие курсы вы бы выбрали для себя?  

Очные
Онлайновые
Платные
Бесплатные
Я и так все знаю

 Читать далее...

1001 и 1 книга  
24.12.2018г.
Просмотров: 769
Комментарии: 0
Python. Разработка на основе тестирования

 Читать далее...

24.12.2018г.
Просмотров: 561
Комментарии: 0
Скрапинг веб-сайтов с помощью Python

 Читать далее...

24.12.2018г.
Просмотров: 500
Комментарии: 0
Смарт-карты и информационная безопасность

 Читать далее...

24.12.2018г.
Просмотров: 498
Комментарии: 0
Идеи машинного обучения

 Читать далее...

22.11.2018г.
Просмотров: 791
Комментарии: 0
MySQL 8 для больших данных

 Читать далее...

Друзья сайта  

Форум системных администраторов  

sysadmins.ru

 Создаем свой YouTube. Как обработать видео средствами веб-сервера

Архив номеров / 2009 / Выпуск №12 (85) / Создаем свой YouTube. Как обработать видео средствами веб-сервера

Рубрика: Веб /  Веб-технологии

АЛЕКСАНДР МАЙОРОВ, программист @MAIL.RU, семь лет занимается веб-разработкой, три из котрых посвятил программированию под мобильные устройства

Создаем свой YouTube
Как обработать видео средствами веб-сервера

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

С чего начать?

Существует несколько инструментов для работы с видео, среди которых наибольшее распространение получили 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.

Рисунок 1. Сборка ffmpeg-php

Рисунок 1. Сборка ffmpeg-php

Проверить, подключен ли ffmpeg-php, можно несколькими способами. Например, посмотреть в phpinfo информацию о расширении. Если оно подключено, то вы увидите примерно следующее (см. рис. 2).

Рисунок 2. Вывод информации о ffmpeg-php в phpinfo

Рисунок 2. Вывод информации о ffmpeg-php в phpinfo

Если вы пишете консольную версию программы, то проверить информацию о ffmpeg-php можно и в консоли:

$ php -i | grep ffmpeg

Рисунок 3. Вывод информации о ffmpeg-php в консоли

Рисунок 3. Вывод информации о ffmpeg-php в консоли

Возможные проблемы

Не всегда сборка программного обеспечения проходит гладко. Бывают и проблемы. Я опишу два наиболее распространенных случая, которые случались в моей практике, и пути их решения. Один из вариантов ошибок приведен ниже:

/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, которые можно взять здесь:

Создайте директорию, в которой будут размещаться все необходимые файлы. У меня это 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.

Комментарии отсутствуют

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

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru