Как в Linux наложить субтитры на видео и ускорить (пример с mencoder)

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

Для этой цели можно воспользоваться утилитой mencoder (пример для ffmpeg см. в другой статье), пример:

  • Формат mpeg4 контейнер avi:
    mencoder -speed $speed -ofps $ofps -ovc lavc \
     -lavcopts vcodec=mpeg4:vbitrate=$vbr -sub $sub -of avi -o $of $f
  • Формат x264 контейнер mp4:
    mencoder -speed $speed -ofps $ofps -ovc x264 \
     -x264encopts threads=auto:profile=baseline -sub $sub -of lavf -lavfopts format=mp4 -o $of $f

#где
$speed # число, во сколько раз ускорить видеопоток, например 10
$ofps  # кол-во кадров в сек., в полученном видеопотоке (после обработки), например 30
$vbr   # битрейт в полученном видеопотоке, например 3600
$sub   # исходный файл с субтитрами
$of    # файл, куда сохранять
$f     # исходное видео

Например, в каталоге $idir с видеофайлами *.3gp и субтитрами *.srt, можно организовать цикл в скрипте на bash для fmt=avi или fmt=mp4, пример:

for f in $idir/*.3gp; do
        bf=$(basename $f)
        of=$odir/${bf%.3gp}x${speed}.$fmt
        test -f "$of" && { echo "File $of exist"; continue; }
        sub=${f%.3gp}.srt
        test -f "$sub" || { echo "File $sub not found"; exit 1; }
        echo "### Convert ###"
        echo "### From $f fps*$speed and sub=$sub"
        echo "### To $of fps=$ofps vbr=$vbr"
        case $fmt in
             avi) mencoder -sub $sub -subcp utf8 -font 'CMU Serif Upright Italic' -speed $speed \
              -ofps $ofps -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$vbr -of $fmt -o $of $f;;
             mp4) mencoder -sub $sub -subcp utf8 -font 'CMU Serif Upright Italic' -speed $speed \
              -ofps $ofps -ovc x264 -x264encopts threads=auto:profile=baseline -of lavf \
              -lavfopts format=$fmt -o $of $f;;
        esac
done

тут каждый видеофрагмент и соответствующий файл с субтитрами склеивается (для субтитров указан шрифт и кодировка), полученный видеофрагмент помещается в каталог $odir.

Далее можно видеофрагменты из каталога $odir склеить в файл $odir.$fmt:

fll=""
cd $odir || { echo "Error cd to $odir"; exit 1; }
for fl in ./*.$fmt; do
        fll="$fll $fl"
done
if [ -f "${odir}.$fmt" ]; then
        echo "### Join skip: File ${odir}.$fmt exist"
else
        echo "### Join to ${odir}.$fmt"
        case $fmt in
                avi) mencoder -ovc copy $fll -of $fmt -o ${odir}.$fmt;;
                mp4) mencoder -ovc copy $fll -of lavf -lavfopts format=$fmt -o ${odir}.$fmt;;
        esac
fi

Для помещения на веб ресурс можно использовать полученный mp4, либо альтернативно перекодировать в формат webm (оба эти формата совместимы с html5 см. http://www.w3schools.com/HTML/html5_video.asp, пример:

ffmpeg -i ${odir}.$fmt -codec:v libvpx -b:v ${webr}k ${odir}.webm
#где
${webr} # битрейт в полученном видео webm

Видео mp4 в формате h264 c profile=baseline и видео в формате webm можно просматривать на android устройствах, Пример:

  • Видео в формате webm:
  • Видео в формате mp4:

Обсуждение закрыто.