ffmpeg - 覆盖视频中的音频直到音频结束

ffmpeg - 覆盖视频中的音频直到音频结束

我有一个视频文件,假设它的名字是 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

  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]
    
  2. 使来自其他输入的音频符合以下属性audio.aac

    ffmpeg -i input.mp4 -ss 29.463936 -map 0:a -c:a aac -ar 44100 -ac 2 conformed.m4a
    
  3. 制作input.txt

    file 'audio.aac'
    file 'conformed.m4a'
    
  4. 连接:

    ffmpeg -i input.mp4 -f concat -i input.txt -map 0:v -map 1:a -c copy -movflags +faststart output.mp4
    

相关内容