是否可以将视频文件的一部分(比如 5 秒)静音,而不必使用 ffmpeg 重新编码整个音频流?我知道通过重用现有的大部分音频流并仅重新编码更改的部分以及前后可能的一小部分,在技术上(尽管可能并不容易)这是可能的,但我不确定 ffmpeg 是否支持这一点。如果没有,有人知道有其他图书馆吗?
答案 0 :(得分:0)
您可以按照您的建议进行部分分段编码,但是如果源编解码器是基于 DCT 的,例如 AAC/MP3,则一旦您将其全部拼接起来,重新编码的片段的开头和结尾就会出现故障重归于好。
您将使用段复用器和连接分离器来执行此操作。
ffmpeg -i input -vn -c copy -f segment -segment_time 5 aud_%d.m4a
重新编码有问题的片段,说 aud_2.m4a
到 noaud_2.m4a
。
现在创建一个文本文件
file aud_0.mp4
file aud_1.mp4
file noaud_2.mp4
file aud_3.mp4
然后运行
ffmpeg -an -i input -f concat -safe 0 -i list.txt -c copy new.mp4
答案 1 :(得分:0)
下载小sample file。
这是我的计划可视化:
# original video
| video |
| audio |
# cut video into 3 parts. Mute the middle part.
| video | | video | | video |
| audio | | - | | audio |
# concatenate the 3 parts
| video | video | video |
| audio | - | audio |
# mux uncut original video with audio from concatenated video
| video |
| audio | - | audio |
让我们这样做。
存储文件名:
i="fridayafternext_http.mp4"
要静音“你到底在我家干什么!?”,静音应该从 34
秒开始,持续 2
秒。
为了您的方便而存储所有这些:
mute_starttime=34
mute_duration=2
bash
支持简单的数学运算,因此我们可以自动计算音频再次开始的开始时间,当然是 36
:
rest_starttime=$(( $starttime + $duration))
创建所有 3 个部分。请注意,对于第二部分,我们使用 -an
使音频静音:
ffmpeg -i "$i" -c copy -t $mute_starttime start.mp4 && \
ffmpeg -i "$i" -ss $mute_starttime -c copy -an -t ${mute_duration} muted.mp4 && \
ffmpeg -i "$i" -ss $rest_starttime -c copy rest.mp4
使用以下文本创建 concat_videos.txt
:
file 'start.mp4'
file 'muted.mp4'
file 'rest.mp4'
使用 Concat demuxer
连接视频:
ffmpeg -f concat -safe 0 -i concat_videos.txt -c copy muted_audio.mp4
多路复用原始视频和新音频
ffmpeg -i "$i" -i "muted_audio.mp4" -map 0:v -map 1:a -c copy "${i}_partly_muted.mp4"
注意:
我从 Gyan 的 answer 了解到您在 1 个镜头中完成最后 2 个步骤,这真的很酷。
ffmpeg -an -i "$i" -f concat -safe 0 -i concat_videos.txt -c copy "${i}_partly_muted.mp4"