———用途———
将任意视频/文件编码为噪声视频,通过解码得到原始视频/文件。
这可以做到对已封禁或正在被审查的视频提供保护。

———原理———
通过 Reed-Solomon 编码 将任意文件转换为白噪声视频,并在允许范围内部分丢失数据的情况下可将噪声视频还原到哈希值(SHA-256)相同的原始文件。
项目地址:https://github.com/ERR0RPR0MPT/Labyrinth-go

———优点———

  1. 如果你需要转换的原始文件是一个视频,那么恭喜你,这是项目实现的主要目标。
    使用此方法转换得到的原始视频即使哈希不匹配,在可接受的数据损失下,画面仍然是可读的。
    这种方案对比使用对视频逐帧处理为白噪声再上传到视频平台压缩后下载下来处理为原视频的方法,后一种方法的数据已经被压缩丢失的差不多了,所以基本上不可行;此方法中可以将白噪声使用低分辨率视频作为载体,避免被二次编码时压缩过多数据。

如果你需要转换的是一个文件,那你需要万无一失地确保解码不会出现错误。

  1. 项目没有使用任何加密算法,所以编码后的噪声视频也能看出存在各种明文特征。你可以搭配压缩或加密程序使用本项目。

  2. 此方案也可以用于其他的场景,比如可以打破某些云盘只能上传视频不能上传文件的限制。

  3. 项目使用 Go 实现,对配置要求不是很高。

———缺点———

  1. 为了保证数据尽可能的完整性,项目使用视频中的 8 个像素 表示数据的 1 字节,以及使用 Reed-Solomon 编码 进行数据纠错。这导致白噪声视频的大小是原始文件的 5-10 倍(取决于 dataShards 与 parityShards 的比值)
  2. 对磁盘 IO 有较高要求。
  3. 项目目前处于能用的状态,但经实验,经过冗余产生的噪声无论 dataShards 与 parityShards 的比值如何,经过转换得到的解码文件的质量总与视频损失的码率有关,可能是压缩时总是均匀损失数据导致的?(或者只是单纯的 Bug
  4. 在时间消耗上,编码 100MB 的数据需要 12min 左右,解码需要 8min 左右,对于急需使用此数据的情况来说较慢。

———其他———
这种方案能不能用于(R6(划掉)直播?
暂时还没有尝试过推流、实时解流的方案,项目中也没有任何用于流式传输的代码,但理论上对于推送低码率视频流来说应该足够。
未来可期

一些使噪声视频码率尽可能小的方法:
使用诸如 36x36 64x36 的低分辨率;
帧数使用 12/24 fps;
实测时长 9:36:05 的噪声视频 36x36 24fps 原始码率 177kbps,B 站压缩后码率 175kbps,这种数据损失可以通过 RS 算法进行修复。
下载噪声视频可以使用各种开源的工具,请自行搜索。
对于 B 站而言,默认生成的 25 fps 的视频帧数不能超过 256060 = 900000(即噪声视频时长不能超过 10 小时)

命令行参数 a 表示 dataShards, b 表示 parityShards 。
详细使用说明见项目文档。

虽然我不玩 R6,但我看番(
这是我转换得到的一些噪声视频,作为示例放在这里
56CC57OW55qE5bm456aP55Sf5rS7
https://space.bilibili.com/125160481/channel/seriesdetail?sid=3252896

  1. BV1nk4y1E7my
  2. BV1vk4y1E7Da
  3. BV1fk4y177Wc
  4. BV1nm4y1C76E
  5. BV1BT411h7bg
  6. BV1mP41127XH
  7. BV1Xz4y1Y7bw
  8. BV1U14y1Z7cD
  9. BV1Fz4y1e7Qf
  10. BV1Hz4y1h7vH
  11. BV12s4y1g75g
  12. BV18L411a7sr

————————

灵感来源(按时间排序):
课上
av570343985
BV1Nm4y117y5