ffmpeg

ffmpegで静止画と音声をくっつけた映像を作る

More than 3 years have passed since last update.


ffmpegで静止画と音声をくっつけた映像を作る

mp3tubeみたいなのやりたいって感じ


方針


  1. 静止画を映像データにする

  2. 上記の映像と音声を合成する

  3. (゚д゚)ウマー


手順


  • 手元に静止画image.jpgと音声sound.wavがある


  • image.jpgからimage.aviを作る→image.avisound.wavを合成する

$ ffmpeg -f image2 -r 1 -loop 1 -t hh:mm:ss -i image.jpg image.avi

$ ffmpeg -i image.avi -i sound.wav out.avi



  • -fで画像を入力するという事を教える


  • -r 1でフレームレートを指定


  • -loop 1-loop_inputの代替として使った。-loop_inputは入力ストリームをループさせる。


  • -t hh:mm:ssで時間を指定する。数字をそのまま書けば秒として認識される(っぽい)


  • -i image.jpgで静止画を指定、image.aviとして出力させる。

  • このとき-vcodecとか使って映像を自由にいじれる。-s使って映像サイズを指定する事も可能。

  • フレームレートがかなり低いので、この時点で容量がかなり少なくなるはず。あまり品質を気にする必要はないと思われる。


  • image.avisound.wavの合成は特に難しいことはない。ここで-acodecとかして音声をエンコードする事も可能。映像に関して何も書かなければ映像ストリームはコピーされる。

映像のエンコード、音声のエンコードはそれぞれ作る時点で行ったほうが無駄が少ないと思う。


一連の処理を行うスクリプト

#!/bin/bash

CMDNAME=`basename $0`

if [ $# -ne 6 ]; then
echo "Usage: $CMDNAME [-i image] [-s sound] [-o output]" 1>&2
exit 1
fi

while getopts i:s:o: OPT
do
case
$OPT in
"i" ) image="$OPTARG";;
"s" ) sound="$OPTARG";;
"o" ) output="$OPTARG";;
* ) echo "Usage: $CMDNAME [-i image] [-s sound] [-o output]" 1>&2
exit 1;;
esac
done

dur=`ffmpeg -i $sound 2>&1 | grep Duration | sed -e s/Duration:\ // -e s/,.*//`

ffmpeg -f image2 -r 1 -loop 1 -t $dur -i $image temp.mp4 -s 1920x1080 -vcodec libx264 -y -threads 0
ffmpeg -i temp.mp4 -i $sound $output -acodec libfaac -threads 0
rm temp.mp4

exit

色々雑だけどまぁいいやこれで。引数をとるスクリプトを書きたかったからこういうの作っただけ。

見ればわかるけど、


  • -s 1920x1080

  • -vcodec libx264

  • -acodec libfaac

って感じでエンコしてるよ。


つかいかた

Usage: $CMDNAME [-i image] [-s sound] [-o output]

わかるよね。



  • -iで画像を指定


  • -sで音声を指定


  • -oで出力先を指定