我有一个视频文件,假设它的名字是 video.mp4。这个视频有自己的音频。我还有一个音频文件,假设是 audio.aac,比视频短。
我想使用 ffmpeg 用 audio.aac 中的音频覆盖 video.mp4 中的音频。但由于 audio.aac 比 video.mp4 短,因此在它结束后,我希望视频的原始音频能够继续播放(当然不是从头开始,我不想移动它)。
最好不要重新编码。
编辑:video.mp4 和 audio.aac 不是我有的文件。我想制作一个可以处理任何输入文件的脚本。以下是我目前拥有的一些脚本:
我可以像这样从视频中提取音频:
ffmpeg -i $1 -vn -acodec copy $2
我可以用另一个文件中的音频替换视频中的音频,如下所示(保持最短长度):
ffmpeg -i "$1" -i "$2" -vcodec copy -acodec copy -shortest -map 0:v -map 1:a "$3"
我可以用另一个文件中的音频替换视频中的音频,如下所示(不保持最短长度):
ffmpeg -i "$1" -i "$2" -vcodec copy -acodec copy -map 0:v -map 1:a "$3"
我可以像这样修剪视频(我知道如果不重新编码可能不太准确但对我来说有效):
ffmpeg -ss "$1" -i "$2" -ss 0 -c copy -to "$3" -avoid_negative_ts make_zero "$4"
我想做一些类似第三个脚本的事情,但我不想在音频结束后保持静音,而是想要视频的原始音频。
答案1
获取有关
audio.aac
包括持续时间的信息。ffprobe -v error -show_streams -show_entries stream=codec_name,sample_rate,channels:format=duration audio.aac
示例输出:
[STREAM] codec_name=aac sample_rate=44100 channels=2 [/STREAM] [FORMAT] duration=29.463936 [/FORMAT]
使来自其他输入的音频符合以下属性
audio.aac
:ffmpeg -i input.mp4 -ss 29.463936 -map 0:a -c:a aac -ar 44100 -ac 2 conformed.m4a
制作
input.txt
:file 'audio.aac' file 'conformed.m4a'
连接:
ffmpeg -i input.mp4 -f concat -i input.txt -map 0:v -map 1:a -c copy -movflags +faststart output.mp4