程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用实际录音过滤掉视频中的噪音大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用实际录音过滤掉视频中的噪音?

开发过程中遇到使用实际录音过滤掉视频中的噪音的问题如何解决?下面主要结合日常开发的经验,给出你关于使用实际录音过滤掉视频中的噪音的解决方法建议,希望对你解决使用实际录音过滤掉视频中的噪音有所启发或帮助;

我使用我的笔记本电脑(戴尔 XPS13 上的 Ubuntu 18.04 LTS 衍生版)使用 OBS 录制视频(这些只是旁白演示)。演示完成后(.flv 格式),我使用 ffmpeg 处理它,使用过滤器尝试减少背景噪音,减小视频大小,将编码更改为 .mp4,插入水印等。几个月来,这个系统效果很好。

但是,我的笔记本电脑现在开始显示其年龄(已使用 4 年)。这意味着风扇声音会变大 - 足以在录音中引起注意,而不会在您工作时引起注意。因此,即使在 ffmpeg 中过滤低频后,视频中也会留下点击和其他类型的声音。我是一名科学家,虽然不是音频/视频专家。所以,我在想 - 是否可以在我不演示时简单地记录我的机器发出的噪音,然后使用该录音过滤掉我的机器在演示期间发出的噪音?

过滤掉某些范围的音频频谱等一揽子方法不太可能奏效,因为噪声的功率谱可能有许多峰值,而且这些峰值也可能扩展到人声范围内(我可以听到他们)。此外,这是一个不断变化的目标——笔记本电脑正在老化,无论如何,它产生的噪音的数量和类型取决于负载和它已经使用了多长时间。算法:

  1. 记录实际计算机噪音(加上背景噪音),而我没有在录音。理想情况下,就在开始录制演示文稿之前。这可以采用 1-2 分钟的音频样本的形式。
  2. 在 OBS 上录制演示文稿。
  3. 使用 1 作为过滤器来消除 2 中的噪声。我想这将涉及对 1 进行傅立叶分析,然后在每个时间周期从 2 的频谱中去除这些峰值。

我已经研究过 sox,这是人们有些轻率地指向您而没有提供任何细节的东西。我不知道如何从视频中分离出音频通道,然后将它们交织在一起(这里不是软件专家)。除了 RTFM,是否有人可以提供任何有用的建议?我已经搜索过,但没有找到 HOWTO。我认为这可能是我搜索的错误,因为我拒绝相信这是一个新想法 - 它是许多领域(包括天文学)中用于消除噪音的标准方法。

解决方法

我没有足够的声誉来发表评论,所以这是我的答案,因为它适用于我的情况,我自己也在寻找答案。它可能适用于您的情况,也可能不适用于您的情况,因为我使用 ffmpeg 记录我的屏幕(这可以记录屏幕上的所有内容,但对于单个程序/窗口或屏幕的一部分来说不是一个很好的选择,这可以完成,但我认为没有视觉指示正在录制屏幕的哪个部分)。

我遇到了 afftdn 过滤器(@Gyan 在对 OP 问题的评论中也提到了该过滤器)并且能够成功使用它。

这个过程可能只适用于 ffmpeg 制作的现场录音——至少我想不出用预先录制的内容来做这件事的方法。以下过程也适用于纯音频输入,但您需要修改 ffmpeg 命令以仅录制音频。它是这样工作的:

  1. 运行 ffmpeg 命令来录制您的音频/屏幕。
  2. 指示afftdn记录背景噪音并安静地坐一会儿。
  3. 指示afftdn停止录制背景噪音,并继续进行语音评论和演示的实际录制。
  4. 从输出文件中丢弃录音的开头,其中只包含背景噪音的录音。

对于第 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) 是我的屏幕分辨率(相应地调整,您也可以将其设置为小于屏幕分辨率以仅记录屏幕的一部分 - 结合此使用 offset 参数将记录的部分从屏幕的左上象限移动),参数 -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

大佬总结

以上是大佬教程为你收集整理的使用实际录音过滤掉视频中的噪音全部内容,希望文章能够帮你解决使用实际录音过滤掉视频中的噪音所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: