V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
neteroster
V2EX  ›  问与答

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

  •  
  •   neteroster · 2020-05-24 08:49:01 +08:00 · 3163 次点击
    这是一个创建于 1427 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    他的意思就是嵌入画面里,就是每帧一个二维码,连续解码,然后拼接。。
    理论上完全可以啊
    Telegram
        9
    Telegram  
       2020-05-24 15:03:49 +08:00
    在 github 随便搜了一下,发现好像有现成的轮子:
    https://github.com/Neohapsis/QRCode-Video-Data-Exfiltration
    未验证
    Telegram
        10
    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
        11
    qieqie  
       2020-05-24 15:17:16 +08:00 via Android
    如果你要的不是那种可以防再次编码的数字水印,h264/hevc 标准中规定的 SEI (Supplemental Enhancement Information)就是给你写入自定义信息的。
    Telegram
        12
    Telegram  
       2020-05-24 15:23:43 +08:00
    msg7086
        13
    msg7086  
       2020-05-24 16:26:01 +08:00
    @Telegram 我不确定楼主是想要这个效果还是只知道这个效果。毕竟各个层面上都有办法植入数据,像素上植入是植入效率最低的,只有在要求鲁棒性的环境下才适用。如果只是要插入普通的自定义信息的话,流层面上像楼上说的 SEI 就是用来干这个的。容器上也可以写,像是 MKV 和 MP4 都可以加入自定义元素。
    zingl
        14
    zingl  
       2020-05-24 18:18:54 +08:00
    LZ 的意思是把二进制文件嵌入到媒体文件进行隐匿分发

    虽然 LZ 的标题写得不咋地,内容还是讲得比较清楚的啊
    msg7086
        15
    msg7086  
       2020-05-25 02:07:04 +08:00
    @zingl 帖子内容只是想法,不是目的。
    我现在解读问题的时候,常常不得不考虑 X-Y 问题的可能性。
    我现在看到的目的是 1) 二进制数据编码进视频文件; 2) 视频文件可播放; 3) 编码的数据可从文件中读取。
    只考虑这 3 点的话楼主内容里写的想法不是最合适的做法。
    所以我第一条的回复就是希望楼主明确自己的目的,否则下面一群人就只能漫无目的地回复。
    jifengg
        16
    jifengg  
       2020-05-25 17:41:21 +08:00
    如果不考虑被平台重新转码的话,直接 base64 存到字幕流哈。
    如果考虑被转码的话,应该只能从视频画面本身着手了吧。
    neteroster
        17
    neteroster  
    OP
       2020-05-25 18:13:24 +08:00
    @Telegram @msg7086 @qieqie 谢谢你们提供的信息。本身这个贴就是突发奇想的一个念头。确实在描述中没有说清楚到底是要在视频文件的其他部分嵌入数据还是在可视的帧中嵌入。我的想法更接近 @Telegram 提供的项目,类似于一个动态的二维码,仅靠人眼能识别的信息就能还原出数据。虽然这样确实不是效率最高的办法,但是对我来说的确显得更“有趣”一些。总之还是谢谢大家提供的信息!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2570 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 01:24 · PVG 09:24 · LAX 18:24 · JFK 21:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.