10

我有很多不同大小的图像(即 1024x768 和 900x942)和一个 30 秒的音频文件(audio.mp3),我需要从中创建一个视频。

我现在正在尝试:result%d.png (1 to 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 表示,从第一张图片开始,意思是 ./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();    

其中持续时间=图像数量/音频持续时间,即在 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 都是 Strings

于 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 回答