Open3

1つの静止画と音声ファイル(mp3)から動画を作成する方法(コマンド例と解説)

ピン留めされたアイテム
Thinking birdThinking bird

FFmpegで1つの静止画と音声ファイルから動画を作成する方法(コマンド例と解説)

FFmpegは非常に強力なマルチメディアフレームワークであり、静止画像1枚と音声ファイル1つを組み合わせて、音声の長さに合わせた動画ファイルを作成することができます。この記事では、そのための基本的な考え方、よく使われるコマンドラインオプション、そして具体的なコマンド例と関連するTipsを紹介します。

ffmpegのPATHを通す

export PATH=/Applications:$PATH

基本的な考え方と注意点

主なアプローチは、静止画像を -loop 1 オプションでループさせ、-shortest オプションを使って最も短い入力(通常は音声ファイル)の長さに合わせて動画の生成を終了させることです。

コマンドを実行する際には、以下の点に注意してください。

  • オプションの順序: FFmpegではコマンドラインオプションを指定する順序が重要です。入力ファイルに適用するオプション(-loop, -r など)は、該当する -i <入力ファイル> の直前に記述します。出力全体に影響するオプション(-shortest, -c:v, -c:a など)は出力ファイル名の前に記述する必要があります。
  • 主要なオプション:
    • -loop 1: 画像などのストリームを無限にループさせます。静止画像を入力する際に -i image.jpg の前に指定します。
    • -shortest: 最も短い入力ストリームの長さに合わせてエンコードを終了します。出力ファイル名の前に指定します。
    • -c:v <コーデック>: ビデオコーデックを指定します。
      • libx264: 高圧縮・高品質なH.264コーデック。静止画には -tune stillimage オプションと組み合わせると効果的です。
    • -c:a <コーデック>: オーディオコーデックを指定します。
      • copy: 音声ストリームを再エンコードせずにそのままコピーします。品質劣化がなく高速です。
      • aac, mp3 など: 指定したコーデックに再エンコードします。-b:a <ビットレート>(例: -b:a 192k)で品質を指定できます。
    • -tune stillimage: libx264 コーデック使用時に、静止画コンテンツ向けに圧縮設定を最適化します。
    • -r <フレームレート>: フレームレートを指定します。静止画から動画を作る場合、1 などの低い値を設定するとエンコード時間やファイルサイズを削減できることがあります。入力と出力の両方に指定することも有効です。
    • -pix_fmt yuv420p: 多くのプレイヤーやサービス(YouTube、QuickTimeなど)との互換性を高めるためのピクセルフォーマット指定です。
    • -vf <フィルター>: ビデオフィルターを適用します。scale=横:縦 で解像度を変更できます(例: scale=1280:720)。
    • -y: 同名の出力ファイルが存在する場合、確認なしで上書きします。

コマンド例と関連コメント

以下に、目的に合わせた具体的なコマンド例をいくつか紹介します。

例1: libx264で圧縮、音声コピー (比較的小さいファイルサイズ)

ffmpeg -loop 1 -i image.jpg -i audio.mp3 -c:v libx264 -tune stillimage -c:a copy -shortest output.mp4
  • 解説: 静止画像をループさせ、音声の長さで終了します。ビデオは libx264 で静止画向けに最適化して圧縮し、音声はそのままコピーします。
  • 関連コメント:
    • libx264-tune stillimage を使うことで、他のコーデック(例: mjpeg)よりもファイルサイズを大幅に小さくできる場合があります。
    • -shortest オプションは出力ファイル名の前に記述するのが正しい使い方です。

例2: YouTube互換性重視 (低フレームレート、特定解像度)

ffmpeg -r 1 -loop 1 -i image.jpg -i audio.m4a -c:v libx264 -c:a copy -r 1 -shortest -vf scale=1280:720 output.mp4
  • 解説: YouTubeでの再生互換性を高めることを目的とした例です。入力と出力の両方でフレームレートを 1 に指定し、解像度を1280x720に設定しています。(音声コーデックは必要に応じて aac などに再エンコードも可能です。)
  • 関連コメント:
    • YouTubeへのアップロードが途中で止まるなどの問題が発生した場合、この形式が有効なことがあります。
    • 低いフレームレート (-r 1) を指定することで、エンコード時間が大幅に短縮され、ファイルサイズも小さくなる傾向があります。
    • 出力側の -r 1 指定だけでも効果がある、あるいは不要という指摘もありますが、入力・出力双方に指定する例が多く見られます。

例3: Mac (QuickTime) 互換性考慮

ffmpeg -loop 1 -y -i image.jpg -i music.mp3 -c:v libx264 -tune stillimage -c:a copy -pix_fmt yuv420p -shortest output.mp4
  • 解説: 基本的なコマンドに -pix_fmt yuv420p を追加し、macOSのQuickTime Playerなどでの再生互換性を高めることを意図したコマンドです。
  • 関連コメント:
    • macOS環境で動画が正しく表示されない場合に試す価値があります。
    • ただし、環境によってはよりシンプルなコマンドの方が高速かつファイルサイズが小さくなる場合もあるようです。

例4: -loop-shortest を使用しない方法 (注意点あり)

ffmpeg -i image.jpg -i audio.mp3 -c:v libx264 -tune stillimage -c:a copy output.mp4
  • 解説: -loop 1-shortest を使わない方法です。
  • 関連コメント:
    • エンコード速度が非常に速く、出力ファイルサイズが入力ファイルの合計程度に収まるという利点が報告されています。
    • 【重要】この方法で生成された動画は、実質的に1フレームの長さしか持ちません。そのため、多くの動画プレイヤーやサービス(特にYouTube)では、再生時間が非常に短い、映像が黒画面になる、音声しか再生されない、といった問題が発生する可能性が非常に高いです。 互換性を重視する場合は推奨されません。

例5: 最もシンプルなループと最短指定

ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4
  • 解説: 最も基本的なオプションのみを使用したコマンド例です。ビデオコーデックはFFmpegが自動選択します(コンテナ形式によりますが、ファイルサイズが大きくなる可能性があります)。
  • 関連コメント:
    • 他の複雑なコマンドが特定の環境(例: Alpine Linux)でうまく動作しない場合に、このシンプルな形式が有効だったという報告があります。
    • -shortest オプションは必ず出力ファイル名の前に記述してください。

補足的な注意点

  • 入力画像の寸法: 特に古いコーデックや yuv420p のようなピクセルフォーマットを使用する場合、画像の幅と高さが奇数だとエンコードエラーになることがあります。可能であれば、事前に画像の寸法を偶数にしておくと安全です。
  • エラーメッセージ: コマンドが期待通りに動作しない場合は、FFmpegが出力するエラーメッセージを確認することが問題解決の第一歩となります。

おわりに

ここで紹介したのは、静止画と音声から動画を作成するためのFFmpegコマンドの基本的な例です。FFmpegには非常に多くのオプションが存在するため、特定の要件(さらなるファイルサイズ削減、品質調整、字幕の追加など)に合わせて、これらの例を元にカスタマイズすることが可能です。公式ドキュメントやコミュニティの情報を参考に、最適なコマンドを見つけてみてください。


当記事は下記を参考に作成しています
https://superuser.com/questions/1041816/combine-one-image-one-audio-file-to-make-one-video-using-ffmpeg/1041818#1041818

Thinking birdThinking bird

Mac OS X (13) における Apple Podcast ダウンロードの場所:
~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Library/Cache