我有很多不同尺寸的图像(即1024x768和900x942)和30秒的音频文件(audio.mp3),我需要从中创建一个视频。
我现在正在尝试:结果%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张第一张图片显示得非常快。
每个图像都需要在相同的时间内显示,直到音频结束。谁知道怎么做?
图像的数量有时会有所不同。
答案 0 :(得分:7)
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:aac:使用aac编码音频
-shortest:音频完成后立即结束视频。
output.mp4:输出文件名
免责声明:我没有测试合并多种尺寸的图像。
参考文献:
https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images
答案 1 :(得分:1)
用于创建视频= n no of Image + Audio
步骤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
答案 2 :(得分:-1)
这应该有所帮助:http://ffmpeg.org/trac/ffmpeg/wiki/Create%20a%20video%20slideshow%20from%20images
使用-r
,您可以设置希望每张图片显示的秒数。