FFmpegを使用して、1つの画像と1つのオーディオファイルを組み合わせて1つのビデオを作成します


183

これはかなり簡単なはずですが、動作させる方法が見つかりません。

FFmpegで入力として1つのJPEG画像とオーディオファイルを取得し、オーディオファイルと同じ期間のビデオファイルを生成します(静止画像全体をストレッチすることにより)。

出力に使用されるビデオコーデックについてはあまり気にしませんが、オーディオコーデックとして「コピー」を使用できる(つまり、トランスコードせずにオーディオストリームをコピーする)ことが重要です。

それを行う正しいコマンドラインは何ですか?

私は試した:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

そして場合とない場合の組み合わせの多くを試してみました-s 640x360-loop_input-shortest-t xxx-r 0.1(ビデオが長くなることを期待して人為的に低フレームレート)と-f image2

エラーが表示されるか、1フレームの長さのビデオファイルが表示されます。

私はグーグルで調べて、提案された解決策を多数見つけました(おそらくこれと同じ質問に)、どれも機能しません。

誰もが作業コマンドを提案し、その背後にある理論的根拠を説明できますか?


コマンドラインを試してみたところ、期待通りに機能しました。問題はサウンド形式にある可能性があります。サウンドのトランスコードは機能しますか?
キャプテンキリン

「予想どおり」ということは、結果のビデオの長さがオーディオ入力と同じだということですか プレイしましたか?1フレームの長さではありませんか?
マッテオ

サウンド形式は問題ではなく、サウンドのトランスコードは機能します
-matteo

paramsの順序の問題もあり、何時間もかかりました!残念なことに、この種の問題はヘルプでカバーされていません。gregoire.org/2009/12/05/fun-with-ffmpeg
ポール・グレゴワール

3
これは私が実験し、それが速いと、ファイルサイズが小さいですが、選択した答えよりも良い..ですffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
ムハンマドUmer

回答:


145

コマンドラインのオプションの順序は重要です。私の場合、次のように機能します。

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

入力がどこにあるかimage.jpgというより一般的なケースではaudio.wav、次のコマンドを使用できます。これらのコマンドはFFmpeg wikiから採用されています

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

これはlibx264エンコーダーを使用し、上記で使用したMJPEGコーデックよりも優れた圧縮を提供します。オーディオはAACであり、ffmpegAACエンコーダーが組み込まれています。


5
ファイルのサイズが[画像のサイズ] + [音声ファイルのサイズ]よりもはるかに大きいのはなぜですか。一定のフレームでビデオ圧縮がおかしくなりそうですか?
アレックジェイコブソン

2
使用するビデオコーデックによって異なります。私の例のコマンドをコピーする場合、コーデックとしてmjpegを使用します。これは各フレームを個別に圧縮するため、すべてのフレームが等しいという事実を利用しません。また、他のコーデックでさえ時々フレーム全体、つまりN番目のフレームごとに再コード化するため、ファイルははるかに小さくなりますが、画像と音声のサイズよりもはるかに大きくなります。(a)そうしないと、最後のフレームにジャンプしたいだけでも、デコーダーはファイル全体を最初から読み取る必要があり、そして
-matteo

2
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
WIM

2
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.aviこれをもっとうまく使ってください!!!?!??!?
ムハンマドウメル14

2
この答えは現在メタで議論されています。
DavidPostill

41

あなたはそれを作っている途中難しく、それがなければならないよりも。FFmpegは、クレジットを与えるよりもはるかにスマートです。ビデオをオーディオトラックと同じ長さにしたいことを知っています。

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

属性のみあなたが持っている指定するinput filenamesoutput codecsoutput filename(そのEO IPSO含みoutput container、)を。

もちろん、最終的なビデオと同じサイズを共有する静止画像から始めることは理にかなっています。FFmpegの出力サイズを指定する代わりに専用の画像エディターを使用している場合、入力サイズが偶数であることを確認する必要があります

出力サイズは、FFmpegの最も一般的なハングアップの1つです。一部のコーデックは、他のコーデックよりも出力の次元が制限されていますが、出力に奇数の高さまたは幅の属性を含めることはできません。

pauseコマンドバッチファイルの最後には、CLIのオープンを保つ- あなたのコマンドラインをデバッグするための最良の方法は、エラーメッセージを読むことであるそれが生成します。これらは非常に具体的であり、FFmpegが持っている最高のドキュメントですが、ウィンドウを閉じる前に読むと開発者のハードワークが無駄になります。

コマンドシェルにcmd /k、開いているウィンドウを維持するスイッチがあり、コマンドプロンプトでバッチスクリプトと同じ命令を実行できます。

FFmpegのはavconvは、両方の使用になります-c:aのために-acodec-c:vのために-vcodec最終的に、私は使用して構築するには、古い命令が正常に動作します。

Nota Bene:すべてのコミットには特異性があります。明確な理由がないためにコマンドラインが失敗する場合、別のビルドを試してみるか、またはFFmpegの最もアクティブな開発者がここ数年来ているlibavに分岐点をたどってみると役立ちます。トランスコーディングツールの名前はavconvに変更されましたが、バッチファイルはどちらでも機能するはずです。


私はあなたとは異なるバージョンを使用している必要があります(コマンドを試して説明したとおりに機能する場合)、質問ですでに述べたように、私はすでに同じコマンドを試しており、期間のビデオを取得しているため音声ファイルの長さではなく、1フレーム(1秒のほんの一部)である。私はそれがインテリジェントであると思っていましたが、(私のバージョンでは)そうではないことが判明しました。
マッテオ

2
こんにちはMatteo、はい、私はそのコードを実行しました。テストせずにそのような主張をするほど不注意なハーフウィットがたくさんあると確信しているので、気分を害さないようにします:)以下の完全な投稿で、FFmpegコンソール出力とMediaInfoへのPastebinリンクを提供します入力ファイルと最終出力ファイルのデータ。FFmpegビルドに対してテストしたい場合、入力ファイル、バッチファイル、出力ファイルはGoogleDriveにあり、自由にダウンロードできます。

@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53あなたのソリューションも@matteoのソリューションも役に立たなかった。また、Googleドライブからファイルをダウンロードしましたが、期待した出力が得られませんでした(出力ファイルは黒で、音声のみが含まれていました)。使用する適切なコマンドを見つけるのを手伝ってください。
-coding_idiot

2
「出力に奇数の高さまたは幅の属性を含めることはできません」正しくありません。pix_fmtをrgb24やyuv444pなどのクロマサブサンプリングを持たないものに設定し、コーデックとコンテナーがそれをサポートしていることを確認し、それ以上の制限がないようにします。pix_fmtに関しては、FFmpegはインテリジェントではありません。特に指示がない限り、yuv420p(クロマサブサンプリングがある)を想定しています。
ジョナサンボールドウィン

複数の画像はどうですか?特定の時間に別の画像に変更する画像が必要です。それぞれの時間パラメーターを使用して、コマンドラインでそれらを指定できるようにしたいと思います。

36

さらに簡単:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpegは、出力ファイルの拡張子に応じて、最適なコーデックを自動的に選択しようとします。

更新:YouTubeでビデオの処理が難しいことに気付きました(95%で止まってしまいます)フレームが1つしかないためだと思います。YouTubeを幸せにするために見つけた解決策:フレームを追加します。また、-acodec copy音質を維持するために追加しました。あなたが必要とする-shortestか、それは永遠にループします。(イメージループは無限であるため、オーディオである最短ストリームの終わりで停止します。)フィルタ(など)は指定した順序で処理されるため、オプションの順序は速度にとって非常に重要です。これらのパラメーターの順序を変更すると、結果は劇的に異なります。

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

また、フレームレートを2回設定したことに注意してください。これは偶然ではありません。最初のフレームレートは入力用で、2番目は出力用です。これを正しく行うと、ビデオの1秒あたりのフレームは1つだけになります。つまり、比較的高速にエンコードされます。また、ここで解像度を720pに設定します。つまり、YouTubeでHDオーディオを取得する必要があります。


また、オーディオファイルが.flvコンテナと互換性がない可能性もあります。その場合、オーディオファイルと互換性のあるコンテナ形式が見つかるまで、.webm、.aviまたは任意の形式のような別の(出力)コンテナを試してください。
PJブルーネット

1
これを.JPGと.MP3に使用してMP4を作成しました-完全に機能しました。JPG / MP3から作成したFLVは機能していないようでした。これは、以前のコメントの警告による可能性があります。

2
更新されたバージョンは、Youtubeで機能します。95%で止まっていると思いましたが、ようやく機能しました。
-Basj

これを得た:No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)...これは動作します:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
NineCattoRules

複数の画像はどうですか?特定の時間に別の画像に変更する画像が必要です。それぞれの時間パラメーターを使用して、コマンドラインでそれらを指定できるようにしたいと思います。

14

私のために働いたバージョン:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

-shortest以下のエラーが表示されない場合は、オプションを出力ファイルの前に置く必要があります。

最短オプション(最短入力内のエンコードを終了)は、入力ファイルpic.jpgに適用できません-入力オプションを出力ファイルに適用しようとしている、またはその逆です。このオプションが属するファイルの前にこのオプションを移動します。入力ファイルpic.jpgの解析オプションのエラー。


これをありがとう。他の回答のほとんどは私にはうまくいきませんでした(Alpine Linuxでffmpegを使用)。この答えには、私にとって完璧に機能した最短のコマンドがあります。
-DannyB

8

ffmpegのマンページから:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

発見したように、infileオプションは、それらが適用されるinfileの前に来る必要があります。

これはバグではありませんが、どのinfile引数を適用するかを指定できるメカニズムにすぎません。


複数の画像はどうですか?特定の時間に別の画像に変更する画像が必要です。それぞれの時間パラメーターを使用して、コマンドラインでそれらを指定できるようにしたいと思います。

4

これは私のために働いた

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.mp3 -acodec copy -vcodec libx264 video.avi

vcodec libx264は、mpjeg(100 MBではなく10 MB)よりもはるかに小さなファイルを作成しました。


1
-shortestは出力オプションであり、使用中は入力オプションとして無視される場合があります。
llogan

1

私は@matteoとしてやろうとしていましたが、オーディオなしで、@Colonel Panicのソリューションが最適に機能しました:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

秒単位の期間引数を追加する必要がありました(-t 10)。


-shortestは出力オプションですが、入力オプションとして使用しています。出力ファイルの前に移動すると、を削除できますが-t 10、答えは他の回答とほぼ同じになります。
llogan

0

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4


5
追加したコマンドの動作を説明できますか?
neelsg 14

この回答は、ここにある他の単純な「コメント回答」とあまり変わりません。
-llogan

0

誰かがそれらをバッチ変換したい場合は、これを試してください。

入力フォルダーと出力フォルダー、およびビデオのフォーマットを設定できます。この場合、AVIに設定します。

この回答は、FFmpeg使用して1つの画像と1つのオーディオファイルを組み合わせて1つのビデオを作成するのに非常に役立ちました。

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD

-1

このコマンドを試してください。それは私のために働いています。

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"

2
これは機能しない可能性のある不完全なコマンドです。私はあなたのコマンドを修正およびデバッグできますが、私はあなたのためにあなたの仕事をしませんので、あなたの答えを編集してそれを自分で修正してください。また、ビデオサイズがmatteoが望んでいたものではないことにも気付きました。
-karel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.