#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
で出力先を指定