ffmpegで静止画と音声をくっつけた映像を作る
mp3tubeみたいなのやりたいって感じ
方針
- 静止画を映像データにする
- 上記の映像と音声を合成する
- (゚д゚)ウマー
手順
- 手元に静止画
image.jpgと音声sound.wavがある -
image.jpgからimage.aviを作る→image.aviとsound.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.aviとsound.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で出力先を指定