我没有足够的声誉来发表评论,所以这是我的答案,因为它适用于我的情况,我自己也在寻找答案。它可能适用于您的情况,也可能不适用于您的情况,因为我使用录制屏幕ffmpeg
(这对于录制屏幕上的所有内容都很好,但对于单个程序/窗口或屏幕的一部分来说不是一个很好的选择,这可以完成,但我认为没有视觉指示正在记录屏幕的哪个部分)。
我遇到了afftdn
过滤器(https://ffmpeg.org/ffmpeg-filters.html#afftdn,@Gyan在对 OP 问题的评论中也提到了它)并且能够成功使用它。
该过程可能仅适用于正在制作的现场录音ffmpeg
- 至少我想不出用预先录制的内容来做到这一点的方法。以下过程也适用于仅音频输入,尽管您需要修改ffmpeg
命令以仅录制音频。它是这样工作的:
- 运行
ffmpeg
命令来录制您的音频/屏幕。
- 指示
afftdn
记录背景噪音并安静地坐一会儿。
- 指示
afftdn
停止录制背景噪音并继续您的语音评论和您的演示文稿的实际录制。
- 从输出文件中丢弃录音的开头,它只包含背景噪音的录音。
对于第 1 步。我运行
ffmpeg -f pulse -i <my_input_device> -f x11grab -s 1920x1080 -framerate 30 -i :0.0 -s 1280x720 -filter_complex afftdn=tn=enabled /home/my_user_name/Videos/my_output_file.mp4
列出您的输入设备运行
pactl list short sources
并选择要使用的输入设备的名称 - 我的是alsa_input.pci-000_00_1b.0.analog-stereo
。ffmpeg
上面命令的第一个 -s 参数-s 1920x1080
(屏幕的左上象限),该参数-i :0.0
表示默认屏幕的左上角像素 - 如果您不想记录整个屏幕,则可以使用其他偏移量(如果您更改此偏移量,请相应地更改您的输入分辨率)。第二个 -s 参数 ( -s 1280x780
) 是输出视频分辨率。
第 2 步:点击c
以告知ffmpeg
您正在向过滤器发出命令。ffmpeg
应该通过输出提示您输入Enter command: <target>|all <time>| -1 <command>[ <argument>]
。类型:
afftdn -1 start
过滤器现在正在记录您的背景噪音。
第 3 步:点击c
以告知ffmpeg
您再次向过滤器发出命令,并在出现提示时键入:
afftdn -1 stop
过滤器现在应该从您的音频中过滤背景噪音(在我的情况下,它需要几秒钟才能启动 - 我怀疑这可能取决于噪音记录的长度 - 您可能需要进行一些实验以获得良好的感觉何时开始实际录制)。继续您的录音。
第 4 步。播放音频/视频以找到您的实际视频的开始时间,并消除了噪音。然后告诉ffmpeg
在那个时间之前删除所有内容:
ffmpeg -ss <duration> -i /home/my_user_name/Videos/my_output_file.mp4 /home/my_user_name/Videos/my_output_file_with_noise_removed.mp4
替换<duration>
为要从输入文件中删除的秒数(您还可以提供HH:mm:ss.d
格式的持续时间,小时 HH 和十进制 .d 是可选的),例如:
ffmpeg -ss 30.5 -i /home/my_user_name/Videos/my_output_file.mp4 /home/my_user_name/Videos/my_output_file_with_noise_removed.mp4
当然,使用您喜欢的文件名 - 我喜欢导航到工作目录并发出表单的命令
ffmpeg -ss 30.5 -i input_file.mp4 noiseless_output_file.mp4