web-dev-qa-db-ja.com

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

これはかなり簡単なはずですが、それを機能させる方法を見つけることができません。

FFmpegに1つのJPEG画像と1つのオーディオファイルを入力として使用し、オーディオファイルと同じ長さのビデオファイルを生成します(全期間にわたって静止画像を引き伸ばすことによって)。

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

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

私は試した:

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

-s 640x360-loop_input-shortest-t xxx-r 0.1(動画が長くなることを期待して人工的に低いフレームレート)と-f image2の有無にかかわらず、たくさんの組み合わせを試してみました。

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

私はぐるぐる回って、(これと同じ質問におそらく)提案された多数の解決策を見つけましたが、どれもうまくいきません。

誰かが作業命令を提案し、その背後にある理論的根拠を説明することができますか?

174
matteo

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

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

image.jpgaudio.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で、内蔵のffmpeg AACエンコーダです。

136
matteo

あなたはそれを作らなければならない way より難しい _それはする必要があります。 FFmpegはあなたがそれを信用するよりはるかに賢いです - それはあなたがビデオがあなたのオーディオトラックと同じ長さであることを望むことを知っています。

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

pause

唯一の属性 you have を指定するのはinput filenamesoutput codecs、およびoutput filename(which eo ipso output container、)を含みます。

もちろん、あなたの最終的なビデオと同じ寸法を共有する静止画像から始めるのは意味があります。 FFmpegの出力ディメンションを指定するのではなく、専用のイメージエディタを使用している場合は、 入力ディメンションが偶数であることを確認してください

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

バッチファイルの最後にあるpauseコマンドはCLIを開いたままにします - コマンドラインをデバッグする最良の方法はエラーメッセージを読むことです が生成します。それらは非常に特定的なものであり、そしてFFmpegが持っている最高のドキュメンテーションですが、あなたがそれらを読むことができる前にあなたがウィンドウを閉じることを許すなら開発者の大変な作業は浪費されます。

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

FFmpegavconvはどちらも-c:a-acodecを、-c:v-vcodecに使います_結局のところ、古い命令は私が使っているビルドではうまくいきます。

Nota Bene: すべてのコミットに特異性があります。明らかな理由もなくあなたのコマンドラインが失敗した場合、別のビルドを試すか、あるいはフォークを追ってlibavにたどり着くことがしばしば役に立ちます。ここでFFmpegの最も活発な開発者はここ数年の間です。それらのトランスコードツールはavconvと名前が変更されましたが、あなたのバッチファイルはどちらでも動作するはずです。

39
patronanejo

さらに簡単に:

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オーディオを入手する必要があります。

33
PJ Brunet

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

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

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

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

14
fguillen

Ffmpegのマンページから:

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

あなたが発見したように、infileオプションはそれらが適用されるinfileの前に来なければなりません。

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

8
ComputerDruid

これは私のために働きました

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

私はvcodec libx264mpjegよりずっと小さいファイルを作成したことを発見しました(100 MBではなく10 MB)。

4
Colonel Panic

私は@ matteoとしてやろうとしていましたが、音声なしで、そして@大佐パニックの解決策が最もうまくいきました:

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

秒数で期間引数を追加するだけです(-t 10)。

1
user284130

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

0
user3535334

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

あなたは、入力と出力フォルダ、そしてあなたがビデオを入れたいフォーマットを設定することができます。この場合私はそれをAVIに設定しました。

この答え 1つの画像と1つのオーディオファイルを組み合わせてFFmpeg を使用して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
0
Suraj Jain