2016-01-20 169 views
1

在这里,我从图像(8)和音频(文件大小:307KB)转换视频。 但视频正在播放一个带有音频的图像,而其他则没有音频。 在我的知识中:因为音频文件的大小非常低。 我想转换视频播放所有带有音频的图像。 示例代码:使用FFMPEG从图像和音频文件转换视频

$audioPath = 'upload/2016/01/tmp_81332/audio_1453307709.wav'; 
$convAudioPath = 'upload/2016/01/tmp_81332/output.mp3'; 
$ffmpeg = '/usr/bin/ffmpeg'; 

$convImgPath = 'upload/2016/01/tmp_81332/image%d.jpeg'; 
$output = 'upload/2016/01/video_81332_1453307709.mp4'; 

exec("$ffmpeg -i $audioPath -f mp2 $convAudioPath"); 
exec("$ffmpeg -framerate 1/5 -i $convImgPath -i $convAudioPath -c:v libx264 -c:a aac -strict experimental -b:a 16k -shortest $output"); 

然而,这扩展了输出的视频文件是音频文件的长度如果是比视频更长。如果音频文件比视频短,使用-shortest会将视频文件缩短。那么是否有一个标志告诉ffmpeg将输出视频的长度保持为输入视频的长度?从wav格式为mp3

回答

2

音频转换不需要你的情况。我们可以用单一命令来完成。通过用-r选项设置输出视频帧速率,可以解决只显示1个图像的问题。

用下面的替换您2条EXEC语句,它应该工作。

exec("$ffmpeg -framerate 1/5 -i $convImgPath -i $audioPath -c:v libx264 -r 30 -c:a aac -strict experimental -b:a 16k $output"); 

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

我也曾在以前的命令删除的-shortest标志。所以,输出可以是视频的长度(如果大于输入音频的长度),否则将是音频的长度。

所以,你可以减少所需的视频部分从第0秒开始,其中视频结束到第N的第二。由于您已经知道输入帧速率(因为-framerate 1/5标志,每张图片显示5秒)和图像数量(8),因此可以找出n。

因此,n = 8×5 = 40秒。

所以,总是先ffmpeg的命令之后切割视频从0到第40秒。这可以通过以下ffmpeg命令来实现。

ffmpeg -i INFILE.mp4 -vcodec copy -acodec copy -ss 00:00:00.000 -t 00:00:40.000 OUTFILE.mp4 

希望这会有所帮助。

+0

我相信OP想要一个可用于多种输入的模板,其中音频和视频的持续时间之间的关系是事先不知道的。你的工作流程需要事后手术。 – Mulvya

+0

@Balaraman L这是很好的解释和很好的解决方案。但它不适合我。音频文件再次对于一个图像仅播放5秒。 –

+0

@RamaLingam我可以知道你在这种情况下使用的音频的全长吗?因为,我在答复中提供的经理声明对我来说非常合适。 –

0

使用

exec("$ffmpeg -framerate 1/5 -i $convImgPath -i $audioPath -af apad -c:v libx264 -r 5 -c:a aac -strict experimental -b:a 16k -shortest $output"); 

此垫具有潜在无限长度的空音频源的音频,因此,视频将总是最短输入。

+0

这不起作用。音频文件不播放所有图像。 –

+0

r <2/5似乎x264流有麻烦播放。用min引入r。值为2/5,但理想情况下为5或更高。 – Mulvya