是否可以把二进制数据编码到可播放的视频文件?

2020-05-24 08:49:01 +08:00
 neteroster

这是一个突发奇想(没有滥用视频网站的意思,别误会了)。

从技术上讲应该是可行的,注意这里的要求是“可播放”(单纯改后缀这种不算)。

我的想法大概是可以每帧都播放一个类似二维码的东西,然后解码的时候分别提取所有帧并合并。

或者有其他方案吗?是否有已经实现这种功能的软件 / 工具呢?

3171 次点击
所在节点    问与答
17 条回复
msg7086
2020-05-24 09:09:08 +08:00
你是说嵌在容器里还是嵌在流里还是嵌在编码的帧里还是嵌在画面里?
tangkaichuan
2020-05-24 09:16:55 +08:00
目前不是已经可以把文件加到图片里了吗?将图片连接起来不就是视频🤔
churchmice
2020-05-24 09:18:57 +08:00
早就有了,老弟,去研究下数字水印防盗版
gzlock
2020-05-24 09:32:07 +08:00
视频网站二次压缩视频会破坏你的数据吧?
reus
2020-05-24 09:48:02 +08:00
其实视频画面,就等于你说的“二维码”,只不过视频画面可以直接被人脑解码,而二维码需要机器转码
如果需要对抗二次压缩,那需要比较多的冗余数据,就是显示的二维码码点要比较大,不然一压就变了,解码开销也更大
xml123
2020-05-24 10:36:00 +08:00
二维码的信息冗余也太大了,一个像素 RGB 可以和 3 个 bit 的数据一一对应,你约定一个视频的尺寸,然后依次转换成像素就行了,一帧写满了就写下一帧。如果要抗压缩的话,颜色的种类减少一些,色块取大一些就行了。类似的成品我记得有过,不过是把二进制数据打印成图片再用扫描仪还原;动态二维码的好像也有。
systemcall
2020-05-24 14:29:42 +08:00
@xml123 视频编码一般是 yuv,在线视频网站应该是 yuv420 。二维码每个像素只用到了 2 个状态,而实际上如果是位图的话有 16.7M 的状态,单纯的二维码编码效率很低
我觉得应该可以考虑直接想办法映射到 yuv420,直接拿现成的二维码改应该可行,反正二维码本身可以有一定的冗余,用自带的冗余功能来避免编码对信息的干扰应该是足够的
Telegram
2020-05-24 14:59:05 +08:00
@msg7086 #1 我的想法大概是可以每帧都播放一个类似二维码的东西,然后解码的时候分别提取所有帧并合并。

他的意思就是嵌入画面里,就是每帧一个二维码,连续解码,然后拼接。。
理论上完全可以啊
Telegram
2020-05-24 15:03:49 +08:00
在 github 随便搜了一下,发现好像有现成的轮子:
https://github.com/Neohapsis/QRCode-Video-Data-Exfiltration
未验证
Telegram
2020-05-24 15:16:20 +08:00
在 Issues 中看到另外 1 个叫 txqr 的项目,貌似更成熟一些:
Please take a look at TxQR, which is pretty promising

https://github.com/divan/txqr
https://github.com/divan/txqr-reader
https://github.com/ThePlasmaRailgun/TXQR-Android

![111]( https://github.com/divan/txqr/raw/master/docs/demo.gif)
qieqie
2020-05-24 15:17:16 +08:00
如果你要的不是那种可以防再次编码的数字水印,h264/hevc 标准中规定的 SEI (Supplemental Enhancement Information)就是给你写入自定义信息的。
Telegram
2020-05-24 15:23:43 +08:00
<amp-youtube data-videoid="-MnegPaMkgE" layout="responsive" width="480" height="270"></amp-youtube>
msg7086
2020-05-24 16:26:01 +08:00
@Telegram 我不确定楼主是想要这个效果还是只知道这个效果。毕竟各个层面上都有办法植入数据,像素上植入是植入效率最低的,只有在要求鲁棒性的环境下才适用。如果只是要插入普通的自定义信息的话,流层面上像楼上说的 SEI 就是用来干这个的。容器上也可以写,像是 MKV 和 MP4 都可以加入自定义元素。
zingl
2020-05-24 18:18:54 +08:00
LZ 的意思是把二进制文件嵌入到媒体文件进行隐匿分发

虽然 LZ 的标题写得不咋地,内容还是讲得比较清楚的啊
msg7086
2020-05-25 02:07:04 +08:00
@zingl 帖子内容只是想法,不是目的。
我现在解读问题的时候,常常不得不考虑 X-Y 问题的可能性。
我现在看到的目的是 1) 二进制数据编码进视频文件; 2) 视频文件可播放; 3) 编码的数据可从文件中读取。
只考虑这 3 点的话楼主内容里写的想法不是最合适的做法。
所以我第一条的回复就是希望楼主明确自己的目的,否则下面一群人就只能漫无目的地回复。
jifengg
2020-05-25 17:41:21 +08:00
如果不考虑被平台重新转码的话,直接 base64 存到字幕流哈。
如果考虑被转码的话,应该只能从视频画面本身着手了吧。
neteroster
2020-05-25 18:13:24 +08:00
@Telegram @msg7086 @qieqie 谢谢你们提供的信息。本身这个贴就是突发奇想的一个念头。确实在描述中没有说清楚到底是要在视频文件的其他部分嵌入数据还是在可视的帧中嵌入。我的想法更接近 @Telegram 提供的项目,类似于一个动态的二维码,仅靠人眼能识别的信息就能还原出数据。虽然这样确实不是效率最高的办法,但是对我来说的确显得更“有趣”一些。总之还是谢谢大家提供的信息!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674825

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX