这里我从图像(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 将输出视频的长度保留为输入视频的长度?
最佳答案
您的情况不需要从 wav 格式到 mp3 的音频转换。我们可以用单个命令来完成它。仅显示 1 个图像的问题可以通过 -r 选项设置输出视频帧速率来解决。
将您的 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 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
希望这有帮助。
关于php - 使用 FFMPEG 将图像和音频文件转换为视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34898019/