Наложение изображений на видео

Недавно необходимо было решить задачу наложения изображений на видео, причем не просто водяной знак с постоянными координатами, а движущиеся картинки (лица пользователей).

В ходе анализа возможных вариантов, пришли к такому выводу, что придется раскладывать видео на кадры и на каждый кадр накладывать картинки по определенным координатам во времени. Для этого пришлось изучить возможности таких мультимедиа программ как ImageMagick, ffmpeg, mplayer и mencoder.

Для начала необходимо разложить видео на кадры. Делается это с помощью программы ffmpeg:

Code: bash
# Раскладываем видео на кадры с частотой 25 кадров в секунду
ffmpeg -i ./input/input.flv -r 25 -f image2 ./input/img/img%09d.png

А также необходимо извлечь звук, чтобы впоследствии его вернуть обратно:

Code: bash
# Экспортируем звуковую дорожку в файл mp3
ffmpeg -i ./input/input.flv -vn -acodec libmp3lame -ar 44100 -ac 2 ./input/audio/track.mp3

Теперь необходимо пройтись по всем кадрам и наложить нужные изображения по заранее выбранной траектории, т.е. задать функцию получения координат по времени. В данной статье это не самый важных момент, хотя и непростой... Но в каждом случае у Вас будет своя функция и способ её реализации. В конечном итоге нам нужно будет получить для каждого кадра координаты всех движущихся картинок, а если необходимо, то и их размер и угол поворота.
приведу простейший пример на bash:

Code: bash
# Накладываем изображения на каждый кадр с нужными координатами по времени
cd ./input/img
for fn in *.png; do
  convert .../.../input/img/$fn \
  \( .../.../wm1.png -quality 100 -background transparent -gravity center -rotate $d1 \) -gravity NorthWest -geometry +$h1+$v1 -composite \
  \( .../.../wm2.png -quality 100 -background transparent -gravity center -rotate $d2 \) -gravity NorthWest -geometry +$h2+$v2 -composite \
  -layers merge -depth 8 .../.../output/img/$fn
done

Скажу только, что в рабочем варианте пришлось отказаться от bash для получения координат. Координаты решили прописать в xml файле и считывать их с помощью PHP.

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

Code: bash
# Собираем видео из кадров с частотой 50 кадров в секунду
# и одновременно накладываем звук из файла mp3
ffmpeg -f image2 -i ./output/img/img%09d.png -r 50 -b 1000k -i ./input/audio/track.mp3 -acodec copy -vcodec flv -y ./output/output.flv

Конечно, это не все возможности ffmpeg и ImageMagick, которые можно использовать для этой задачи, но основные шаги я постарался описать. Удачи всем, кто хочет создать свой видео хостинг 🙂

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *