2014-01-04

Организация медиа-архива (видео)

Задача-минимум следующая:
  1. Создать раскадровку для всех видео из указанной папки.
  2. В браузере вывести ссылки на видео и соответствующие раскадровки под ними.
Задача-максимум на будущее:
  1. Многофункциональная галерея для всех видов медиа (видео, аудио, изображения).
Начнем с простого.
Для работы с видео будем использовать мощную библиотеку libav.
Далее буду приводить выдержки из скриптов с описаниями.

thumbnails.sh - генератор раскадровок для видео

Ищем видеофайлы (следуем по ссылкам, только с расширениями mp4, avi, mpeg, mpg):

> find -L "$from_dir" -type f -regextype posix-egrep -regex ".*\.(mp4|avi|mpeg|mpg)
Здесь $from_dir это shell-переменная (например, from_dir=/home/myuser/myvideo).

Затем нужно организовать цикл по найденным видео. Допустим, в теле цикла имя файла передается в переменную $video, тогда для генерации эскизов (fps = 1/20 сек. = 0.05 - то есть 1 кадр через каждые 20 секунд, смещение от начала - 1 сек., размер эскиза - 300x? - то есть пропорциональное уменьшение до прямоугольника не более 300 пикс. по ширине) используем следующую команду:

> avconv -i "$video" -vsync 1 -r 0.05 -ss 1 -vf "scale=300:-1" -an -y "$to_dir$to_path$to_file"
Здесь переменные в конце задают конечный путь для сохранения эскизов. Имя файла обязательно должно содержать маску, например to_file=frame%03d.png.
-vsync // плохо описанный в документации параметр, но без него -r не используется
-an // отключение звука, так на всякий случай :-)
-y // перезапись конечных файлов

media.php - галерея ссылок на видео и соответствующих кадров


// `cmd` - вызов консольной команды из php (аналог shell_exec)
// ищем видео, форматируем пути и сортируем список
$out = `find -L '$videos_dir' -type f -regextype posix-egrep -regex '.*\.(mp4|avi|mpg|mpeg)' | sed 's|$videos_dir||' | sort -n`;
// собираем вывод консольной команды в массив
$videos = explode("\n", trim($out));
$thumbnails = array();
foreach ($videos as $video)
{
        if (file_exists($thumbnails_dir.$video))
        {
                // ищем эскизы для каждого видео
                $out = `find '$thumbnails_dir$video' -type f -name '*.png' | sed 's|$thumbnails_dir||' | sort -n`;
                $thumbnails[$video] = explode("\n", trim($out));
        }
}

P.S.

Все скрипты выложены на github (https://github.com/asvavilov/media-archive)