LoginSignup
34
27

More than 5 years have passed since last update.

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

Posted at

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で出力先を指定
34
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
27