Pull to refresh

Обработка пользовательких видео

Open source *
Некоторое время я занимался (и занимаюсь до сих пор) веб-проектом, где необходимо было добавить фичу для загрузки пользовательских видео-роликов. Собственно, какие могут быть пользовательские видео? Очень разного качества и разнообразных форматов. Начиная от обычных flash файлов, которые представляют наименьшую проблему, до различных записей с телефонов. Встала задача — сделать демона, который бы занимался обработкой очереди загруженных файлов и выполнял следующие функции:
— Конвертирование видео в flash формат (FLV), ипользуя VP6 кодек
— Обновление метаинформации видеофайла
— Создание thumbnails из видео
— Дальнейшии манипуляции с БД

Конкретно в этой статье я рассмотрю варианты обработки уже сконвертированного в формат flash видео-ролика. Итак приступим.

1. Обработка метаинформации

После того как мы получили заветный flash ролик, надо обновить его метаинформацию, а конкретно ключевые позиции. Это необходимо для поддежки режима просмотра — streaming. Т.е «прыгать» по длине видео без загрузки всего файла. Софт который этим занимается обычно именуют Metadata Injector. Для линукса я пробовал:
— FlvTool2 — rubyforge.org/projects/flvtool2
— Yamdi — yamdi.sourceforge.net

FlvTool2 — приложение, написанное на Ruby. Сначала я остановился на нем. Но как показали испытания он не подходит для обработки больших файлов, т.к загружает файл в память, что есть не гуд. Некоторые файлы ( > 200 mb) обрабатывались по 5 минут. Есть свои плюсы — результат пишется в исходный файл. Так же позволяет «обрезать» файлы, что бывает очень нужным.

Yamdi — приложение, написанное на C. Оригинальное название Yet Another Meta Data Injector. Работает очень шутро. Результат его работы представляет собой новый файл, что наиболее удобно, т.к исходник сразу можно удалить или перенести на длительное хранение. Так же позволяет вставлять ивент onLastSecond

Оба приложения могут генерить XML файл с перечнем всех параметров, что дальше ипользуется при обновлении информации видео в БД.
Свой выбор я остановил на Yamdi, как наиболее быстром.

2. Создание thumbnails

Итак, получили готовый FLV файл, XML c метаинформацие. Дальше для этого видео необходимо создать прерью 320x240 (картинка, которая отображается в плеере до того как юзер нажмет старт, пример можно посмотреть на RuTube), несколько мелких превьющек 120x96. В этой области тоже немного утилит.

1. FFmpegffmpeg.mplayerhq.hu
Базовая программа для работы с видео. Я использовал только для конвертирования видео, для остального — не очень подходит, т.к не дает возможности сгенерить все изображения ( с произольными временными точками ) за раз. Точнее там эта функция несколько ограниченная.

2. PHP Extensionffmpeg-php.sourceforge.net
Модуль для php который позволяет напрямую работать с flash файлом. Умеет собирать превью в GIF файл, иногда бывает нужным. Единственное, работает медленно по сравнению с другими утилитами. Плюс — удобный API, если в проекте используется PHP.

3. FFMpegThumbnailercode.google.com/p/ffmpegthumbnailer
Написана на С++ и работает очень быстро. Изначально автор создавал ее для декстоп менеджеров. С недавнего времени обзавелась кучей полезных фич, типо видео фильтров. Возможно использовать в своих C++ программах. Поддерживает 2 выходных формата (jpg/png), выбранную точку можно задавать с помощью абсолютного времени (hh:mm:ss) или в виде процента. Работает со всеми форматами отлично, но бывают сбои на специфичных файлах (mp4). Вообщем, идеально подходит для задачи.

3. На заметку

Первое время мы использовали JWPlayer 4 (без модификации) то столкнулись с проблемой. На серверах работал nginx 0.6.32, который, как выяснилось, не работал с этим плеером. Проблема заключалась в том, что новая версия плеера добавляля в строку запроса файла прочую информацию, вроде этой:

myvideo.flv?start=2659763&width=280&client=FLASH%20MAC%209,0,124,0&version=4.0%20$Rev:%2030%20

Решилось все очень просто, патчем для веб-сервера: www.ruby-forum.com/attachment/2307/patch.flv

4. Заключение

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

P.S. Давно на русском не писал ничего, может немного криво звучит :)
Tags:
Hubs:
Total votes 78: ↑74 and ↓4 +70
Views 3.9K
Comments Comments 33