10

さまざまなサイズ(1024x768と900x942など)の画像と30秒のオーディオファイル(audio.mp3)がたくさんあり、それらからビデオを作成する必要があります。

私は今それを試しています:result%d.png(1から4)とaudio.mp3

ffmpeg -y -i result%d.png -i audio.mp3 -r 30 -b 2500k -vframes 900
-acodec libvo_aacenc -ab 160k video.mp4

ビデオvideo.mp4には30秒ありますが、最後の画像がオーディオの最後まで残っていると、最初の3つの画像が非常にすばやく表示されます。

各画像は、音声が終わるまで同じ時間で表示される必要があります。誰もがそれを行う方法を知っていますか?

画像の数は時々異なります。

4

3 に答える 3

10

FFMPEG バージョン: 3.2.1-1

Ubuntu 16.04.1

wow.mp3 という名前の mp3 オーディオ ファイルがあるとします。この場合、次のコマンドは mp3 の長さを秒単位で取得します。

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 wow.mp3

持続時間を秒単位で取得したら (11.36 秒を取得したと想像してください)。3 つの画像があるので、各画像を (11.36/3 = 3.79) に対して実行したいので、次を使用してください。

ffmpeg -y -framerate 1/3.79 -start_number 1 -i ./swissGenevaLake_%d.jpg -i ./akib.mp3 -c:v libx264 -r 25 -pix_fmt yuv420p -c:a aac -strict experimental -shortest output.mp4

ここでの画像は、./swissGenevaLake_1.jpg、./swissGenevaLake_2.jpg、./swissGenevaLake_3.jpg です。

-framerate 1/3.784 は、各画像が 3.784 秒間実行されることを意味します。

-start_number 1 は、画像番号 1 から開始することを意味し、./swissGenevaLake_1.jpg を意味します。

-c:v libx264: ビデオコーデック H.264

-r 25: 出力ビデオ フレームレート 25

- pix_fmt yuv420p: 出力ビデオのピクセル形式。

-c:a aac: aac を使用してオーディオをエンコードします

-最短: オーディオが終了したらすぐにビデオを終了します。

output.mp4: 出力ファイル名

免責事項: 複数のサイズの画像の結合はテストしていません。

参考文献:

https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images

https://trac.ffmpeg.org/wiki/Encode/AAC

http://trac.ffmpeg.org/wiki/FFprobeTips

于 2016-12-06T12:26:18.937 に答える
2

ビデオを作成する場合= n 画像 + オーディオの数

ステップ1)

次のように、これらの画像のビデオを作成します。

Process proc = Runtime.getRuntime().exec(ffmpeg + " -y -r "+duration +" -i " + imagePath + " -c:v libx264 -r 15 -pix_fmt yuv420p -vf fps=90 " + imageVideoPath);  
            InputStream stderr = proc.getErrorStream();  
            InputStreamReader isr = new InputStreamReader(stderr);  
            BufferedReader br = new BufferedReader(isr);
            String line = null;  
            while ((line = br.readLine()) != null)  
            {       
                //System.out.println(line);  
            }  
            int exitVal = proc.waitFor();  
            proc.destroy();    

duration=No of Images/Duration of Audio つまり、1 秒で何枚の画像が必要か

ステップ2)

    Process proc4VideoAudio = Runtime.getRuntime().exec(ffmpeg +" -i " + imageVideoPath + " -i "+ audioPath + " -map 0:0 -map 1:0 " + videoPath);  
                InputStream stderr1 = proc4VideoAudio.getErrorStream();  
                InputStreamReader isr1 = new InputStreamReader(stderr1);  
                BufferedReader br1 = new BufferedReader(isr1);  
                String line1 = null;  
                while ((line1 = br1.readLine()) != null)  
                {     
                    //System.out.println(line1);
                }  
                int exitVal1 = proc4VideoAudio.waitFor();    
                proc4VideoAudio.destroy();  

ステップ 1 とステップ 2 の両方を順番に実行できるようになりました。手動で行いたい場合のみrun Runtime.getTime.exec(..)

その下のコードは、同期させるためのものです。

**また、画像とオーディオからワンステップでビデオを作成するためのFFMPEGのステートメントにも注意してください。

これらの imagePath、VideoPath、audioPath はすべて文字列です

于 2014-03-19T05:31:09.863 に答える
-1

これが役立つはずです:http://ffmpeg.org/trac/ffmpeg/wiki/Create%20a%20video%20slideshow%20from%20images

を使用して-r、各画像を表示する秒数を設定できます。

于 2012-12-12T09:29:58.787 に答える