使用FFmpeg或PHP-FFmpeg 0.19.0实现视频与MP3音频合并及音频替换的技术咨询
使用FFmpeg或PHP-FFmpeg 0.19.0实现视频与MP3音频合并及音频替换的技术咨询
嘿,我来帮你搞定这个视频替换原有音频、和新MP3合并的需求!不管你是想用原生FFmpeg命令,还是PHP-FFmpeg 0.19.0库,你提到的两种时长匹配场景都能轻松实现,下面给你一步步拆解说明:
一、用原生FFmpeg命令实现
场景1:音频时长(8分钟)长于视频时长(22秒)——循环视频匹配音频
这种情况我们需要让视频无限循环播放,直到音频结束。FFmpeg的-stream_loop参数可以实现视频循环,再配合-shortest参数就能确保最终输出的时长和音频完全一致。
命令直接抄走用就行:
ffmpeg -stream_loop -1 -i input_video.mp4 -i input_audio.mp3 -c:v libx264 -c:a aac -shortest output_video.mp4
简单解释下关键参数:
-stream_loop -1:让输入的视频无限循环(-1代表无限次)-c:v libx264和-c:a aac:用主流的H.264视频编码和AAC音频编码,保证输出的MP4文件兼容性拉满-shortest:因为视频是无限循环的,所以最终输出时长会自动匹配音频的8分钟,完美贴合需求
场景2:音频时长(8分钟)短于视频时长(10分钟)——音频结束即停止输出
这个场景更简单,不需要循环视频,只需要让输出文件的时长和音频一致,同样用-shortest参数,它会自动截断视频到音频结束的时间点。
命令示例:
ffmpeg -i input_video.mp4 -i input_audio.mp3 -c:v libx264 -c:a aac -shortest output_video.mp4
这里-shortest会取输入中时长较短的那个(也就是8分钟的音频)作为输出时长,视频到8分钟的位置就会被截断,刚好和音频同步结束。
二、用PHP-FFmpeg 0.19.0实现
首先得确保你已经通过Composer正确安装并配置了PHP-FFmpeg库,下面分场景给出代码示例:
场景1:音频时长 > 视频时长——循环视频匹配音频
我们需要给视频添加循环参数,在PHP-FFmpeg里可以通过传递FFmpeg原生参数来实现:
require 'vendor/autoload.php'; use FFMpeg\FFMpeg; // 初始化FFMpeg,替换成你服务器上的FFmpeg和FFprobe路径 $ffmpeg = FFMpeg::create([ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', ]); // 打开视频和音频文件 $video = $ffmpeg->open('input_video.mp4'); $audio = $ffmpeg->open('input_audio.mp3'); // 合并时添加循环和shortest参数,让视频无限循环直到音频结束 $video->addAudio($audio) ->save(new FFMpeg\Format\Video\X264(), 'output_video.mp4', [ '-stream_loop' => '-1', '-shortest' => '', ]);
场景2:音频时长 < 视频时长——音频结束即停止输出
这个场景只需要在合并时加上-shortest参数,就能自动截断视频到音频时长:
require 'vendor/autoload.php'; use FFMpeg\FFMpeg; $ffmpeg = FFMpeg::create([ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', ]); $video = $ffmpeg->open('input_video.mp4'); $audio = $ffmpeg->open('input_audio.mp3'); // 合并音频,用shortest参数确保输出时长和音频一致 $video->addAudio($audio) ->save(new FFMpeg\Format\Video\X264(), 'output_video.mp4', [ '-shortest' => '', ]);
备注:内容来源于stack exchange,提问作者KubinParker
相关产品推荐
相关产品推荐

