模拟电视噪声

32

我已经搜索了一些内容,但从未找到答案。如何模拟屏幕上的视频和音频噪声?我的意思是,当我拆下电视天线但电视仍然开着(有时在日本恐怖电影中展示)。我可以使用ffmpeg或任何其他技术,但最简单的信号形式是什么?


为视频帧中的每个像素分配随机RGB值。重复此过程以处理下一帧。对于声音(和视频),您基本上需要生成白噪声。请参见https://dev59.com/IlzUa4cB1Zd3GeqP69Nl。 - Robert Harvey
4个回答

84

使用ffmpeg创建视频和音频噪声、伪影和错误

噪声

使用滤镜

使用geq(视频“通用方程式”)滤镜(以nullsrc作为空白画布)可以创建视频噪声,而aevalsrc滤镜可以创建白噪声音频:

mono noise

ffmpeg -f lavfi -i nullsrc=s=1280x720 -filter_complex \
"geq=random(1)*255:128:128;aevalsrc=-2+random(0)" \
-t 5 output.mkv

请注意,这将创建黑白视频噪声。
使用/dev/urandom
尽管我建议使用geq过滤器,但您也可以使用/dev/urandom生成视频和音频噪声(Windows用户将不得不像上面显示的那样使用geq过滤器)。 这是一个小屏幕截图,但当然视频不会是静态图像:

colored noise

ffmpeg -f rawvideo -video_size 1280x720 -pixel_format yuv420p -framerate 25 \
-i /dev/urandom -ar 48000 -ac 2 -f s16le -i /dev/urandom -codec:a copy \
-t 5 output.mkv

这将创建彩色视频噪点。如果您只想要黑白效果,可以添加hue滤镜。

mono noise

ffmpeg -f rawvideo -video_size 1280x720 -pixel_format yuv420p -framerate 25 \
-i /dev/urandom -ar 48000 -ac 2 -f s16le -i /dev/urandom -codec:a copy \
-t 5 -vf hue=s=0 output.mkv

向现有视频添加随机视觉噪声和错误

使用noise 比特流滤波器

原始图像输入图像说明 原始版本和修改版本。

ffmpeg -i input.mp4 -codec:v huffyuv -bsf:v noise -codec:a copy noise.mkv

根据文档

位流过滤器在编码的流数据上运行,并且执行位级修改而不进行解码。

该位流过滤器可以接受一个值来增加或减少噪音。它是反向的,因此较高的数字表示较少的噪音,1 是最低数字,也就是最多的噪音。您需要尝试不同的值来找到最适合您的选项。
这个第一个例子 stream copied 仅把视频损坏,而音频则被复制了,但是您可以通过移除流说明符将过滤器应用于音频和视频。
ffmpeg -i input.mp4 -codec:v huffyuv -c:a pcm_s16le -bsf noise=1000000 noise.mkv

或者为视频和音频提供单独的值:

ffmpeg -i input.mp4 -codec:v huffyuv -c:a pcm_s16le -bsf:v noise=1000000 -bsf:a noise=100 noise.mkv

这似乎适用于使用rawvideohuffyuv的视频和pcm_s16le的音频,但我建议进行实验。请参见lossless vs corruptionnotes)以查看不同编码器对噪声损坏的反应。
输出的noise.mkv已经损坏,但您可以重新编码它以使其在您的播放器中正常工作:
ffmpeg -i noise.mkv -codec:v libx264 -pix_fmt yuv420p output.mkv

请参阅FFmpeg Wiki上的H.264AAC编码指南,以获取更多编码信息。

宏块效应

有几种方法可以做到这一点,但在此示例中将使用噪声比特流过滤器。输出为MPEG-2视频格式的TS,因为这样会更容易受到所需效果的影响:

ffmpeg -i input.mp4 -bsf:v noise -c:v mpeg2video -q:v 2 -c:a copy macroblock.ts

-q:v 的值提高到约20,如果你想要更“编码化”的外观,请按上面部分中所示添加噪声值,以获取更多噪声。
输出的 macroblock.ts 文件已损坏,但你可以重新编码它,以便在你的播放器中使用。
ffmpeg -i macroblock.ts -codec:v libx264 -pix_fmt yuv420p output.mp4

请参考上面的部分了解有关噪音比特流过滤器的更多信息。 结果可能因人而异,因此您可能无法得到您要寻找的内容。请参见下面的十六进制编辑器方法。

使用十六进制编辑器

另一种方法是使用十六进制编辑器,您可能会发现这种方法更容易、更可控和更一致。请参见:

强制像素格式

您可以欺骗ffmpeg,使其认为色彩空间和色度抽样与实际情况不同,从而产生奇怪的错误效果。

原始图像输入图像描述 原始版本和修改版本。

  1. Probe your input.

    ffmpeg -i original.mp4
    

    Note the frame rate and video frame size.

  2. Refer to ffmpeg -pix_fmts and choose one of the available formats such as yuv420p16le.

  3. Create rawvideo and pipe it to another ffmpeg instance:

    ffmpeg -loglevel error -i original.mp4 -f rawvideo - | ffmpeg -y -f rawvideo -framerate 25 -video_size 1280x720 -pixel_format yuv420p16le -i - -pix_fmt yuv420p video.mp4
    

    The -framerate and -video_size values were copied from the original input file information shown in the console output of step 1. Of course you can also manipulate these for various effects.

  4. Mux audio if desired

    ffmpeg -i video.mp4 -i original.mp4 -map 0 -map 1:a -c copy output.mp4
    

1
请注意,/dev/urandom 提供安全的随机数据,因此可能无法为给定的图片大小和帧速率提供足够快的数据。请参阅 https://blog.kylemanna.com/linux/simple-and-fast-random-data-generator 或考虑使用过滤器方法。 - Axel Heider
如何只使用ffplay来完成相同的操作? - Zibri
@Zibri 你想在ffplay中使用哪种方法? - llogan
使用/dev/urandom(或我编写的更快的程序)模拟电视噪声... 例如dd if=/dev/urandom|ffplay -f u8 -ar 48000 -ac 1 - ## 或者 ## dd if=/dev/urandom|ffplay -fs -f rawvideo -pixel_format gray8 -video_size 1920x1080 -framerate 30 - ### 我只是找不到同时使用两个的方法。 - Zibri
@Zibri 应该作为一个新问题被询问。 - llogan

0

仅供比较,我测试了三种不同的生成伪随机数的方法。 可以看到速度非常不同。 对于高带宽,我建议使用第一种解决方案。 您可以在此处找到源代码: https://github.com/Zibri/rand

顺便说一句,源代码可以进一步优化以获得更好的速度。

$ ./rand|pv -S -s 2G >/dev/null
2,00GiB 0:00:01 [1,58GiB/s] [========================================================================>] 100%            

$ cat /dev/urandom|pv -S -s 2G >/dev/null
2,00GiB 0:00:11 [ 178MiB/s] [========================================================================>] 100%            

$ dd if=/dev/zero bs=1k count=2M 2>/dev/null | openssl enc -rc4-40 -pass pass:weak |pv -S -s 2G >/dev/null
2,00GiB 0:00:04 [ 413MiB/s] [========================================================================>] 100%            

0

是的,你可以使用ffmpeg

ffmpeg -s 640x480 -t 8 \
-f rawvideo -pix_fmt gray16be -i /dev/urandom \
-f s32le -i /dev/urandom \
output.mp4

如何只使用ffplay来完成相同的操作? - Zibri
@Zibri 我刚刚测试了一下,似乎只需要将“ffmpeg”替换为“ffplay”。 - ncomputers
不行,如果我将ffmep管道传输到ffplay,它可以工作...我似乎找不到单个的ffplay命令...这个可以工作:cat /dev/urandom | ffmpeg -f rawvideo -pixel_format rgb24 -video_size 1920x1080 -framerate 60 -i - -f s16le -ar 48000 -ac 2 -i - -c:a pcm_s16le -c:v rawvideo -f avi -|ffplay -fs - ##但我希望不使用管道,只使用ffplay来完成。 - Zibri

-2

这是白噪声

使用随机强度创建灰度图像和完全随机样本的音频


@LordNeckbeard,我在另一个问题的评论中引用了一些示例。 - Alexander Kulyakhtin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接