以最少的重新编码静音音量

时间:2021-07-04 20:29:50

标签: audio ffmpeg volume mute

是否可以将视频文件的一部分(比如 5 秒)静音,而不必使用 ffmpeg 重新编码整个音频流?我知道通过重用现有的大部分音频流并仅重新编码更改的部分以及前后可能的一小部分,在技术上(尽管可能并不容易)这是可能的,但我不确定 ffmpeg 是否支持这一点。如果没有,有人知道有其他图书馆吗?

2 个答案:

答案 0 :(得分:0)

您可以按照您的建议进行部分分段编码,但是如果源编解码器是基于 DCT 的,例如 AAC/MP3,则一旦您将其全部拼接起来,重新编码的片段的开头和结尾就会出现故障重归于好。

您将使用段复用器和连接分离器来执行此操作。

ffmpeg -i input -vn -c copy -f segment -segment_time 5 aud_%d.m4a

重新编码有问题的片段,说 aud_2.m4anoaud_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"

注意:

我从 Gyananswer 了解到您在 1 个镜头中完成最后 2 个步骤,这真的很酷。

ffmpeg -an -i "$i" -f concat -safe 0 -i concat_videos.txt -c copy "${i}_partly_muted.mp4"
相关问题