这里我转换了图像(8)和音频(文件大小:307KB)的视频。 但是视频正在播放带有音频的图像,而其他图像则没有音频。 在我的知识中:因为音频文件的大小非常低。 我想转换视频播放带有音频的所有图像。 示例代码:
$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将输出视频的长度保持为输入视频的长度?
答案 0 :(得分:2)
在您的情况下,不需要从wav格式到mp3的音频转换。我们可以用单一命令来做。通过-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秒剪切所需的视频部分。你可以找到n,因为你已经知道输入帧率(由于-framerate 1/5标志,每张图片显示5秒)和图像数量(8)。
所以,n = 8 x 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
希望这有帮助。
答案 1 :(得分: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");
这会使用可能无限长度的空音频源填充音频,因此视频将始终是最短的输入。