31

我用谷歌搜索了一下,但从来没有找到答案。在屏幕上模拟来自电视的视频和音频噪音的第一种方法应该是什么?我的意思是,当我的电视天线被移除但电视仍然打开时(就像他们有时在日本恐怖电影中展示的那样)。我可以使用 ffmpeg 或任何其他技术,但最简单的信号形式是什么?

4

4 回答 4

79

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

噪音

使用过滤器

( geqvideo "generic equation") 过滤器(nullsrc作为它的“空白画布”)可以产生视频噪声,并且aevalsrc过滤器可以产生白噪声音频:

单声道噪声

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如上所示的过滤器)。这是一个小屏幕截图,但当然视频不会是静态图像:

有色噪声

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过滤器。

单声道噪声

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 是最小的数字,因此噪音最大。您需要进行试验,看看哪种方法最适合您。

第一个示例流复制了音频并且仅对视频进行了故障处理,但您可以通过删除流说明符将过滤器应用于音频和视频:

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

这似乎适用于视频和rawvideo音频,但我建议尝试一下。有关显示不同编码器如何对噪声损坏做出反应的视频,请参见无损与损坏注释)。huffyuvpcm_s16le

输出noise.mkv已损坏,但您可以对其重新编码,以便在您的播放器中正常工作:

ffmpeg -i noise.mkv -codec:v libx264 -pix_fmt yuv420p output.mkv

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

宏块效果

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

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. 探索你的输入。

    ffmpeg -i original.mp4
    

    注意帧速率和视频帧大小。

  2. 参考ffmpeg -pix_fmts并选择一种可用的格式,例如yuv420p16le.

  3. 创建 rawvideo 并将其通过管道传输到另一个ffmpeg实例:

    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
    

    -framerate和值是从步骤 1 的控制台输出中显示的原始输入文件信息复制而来的-video_size。当然,您也可以操作这些以获得各种效果。

  4. 如果需要,多路复用音频

    ffmpeg -i video.mp4 -i original.mp4 -map 0 -map 1:a -c copy output.mp4
    
于 2013-04-03T18:26:56.583 回答
0

是的,您可以使用ffmpeg

ffmpeg -s 640x480 -t 8 \
-f rawvideo -pix_fmt gray16be -i /dev/urandom \
-f s32le -i /dev/urandom \
output.mp4
于 2017-02-15T22:54:02.673 回答
0

只是为了比较,我测试了 3 种不同的方法来生成伪随机数。如您所见,速度非常不同。对于高 badwidth,我建议第一个解决方案。你可以在这里找到源代码: 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%            
于 2019-03-17T18:26:11.100 回答
-2

这是白噪声

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

于 2013-04-03T15:55:52.970 回答