V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jiangnanyanyu
V2EX  ›  程序员

V2 的大佬超好!

  •  
  •   jiangnanyanyu · 2019-01-18 16:23:17 +08:00 · 4818 次点击
    这是一个创建于 2135 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前遇到一个使用 ffmpeg 对 MP4 文件切片成 m3u8 的分片格式,中间使用秘钥加密。 我在找了很多资料得到的几乎全都是只使用单一的 key 去加密,这样每一段切片的秘钥其实是一样的。 我想要的效果是对于每一段分片,可以使用不一样的秘钥来加密。 不是伸手党,找了蛮多资料,几乎全是单一秘钥。

    在 google 中只找到两个官网的 mail https://lists.ffmpeg.org/pipermail/ffmpeg-user/2017-March/035576.html
    https://lists.ffmpeg.org/pipermail/ffmpeg-user/2017-April/035767.html

    但是都没有答复。在 stackoverflow 上也找到一个类似的讨 https://stackoverflow.com/questions/34235397/decrypting-and-combining-ts-audio-files-with-m3u8/34244568#34244568
    最后似乎也是没有结果。在查询官网的文档后,我只是发现了一些单个秘钥加密的 code eg。
    也发现了-hls_flags 参数 ‘ periodic_rekey ’ The file specified by hls_key_info_file will be checked periodically and detect updates to the encryption info. Be sure to replace this file atomically, including the file containing the AES encryption key.。
    这个参数, 大意是说: 将定期检查 hls_key_info_file 指定的文件,并检测加密信息的更新。请务必以原子方式替换此文件,包括包含 AES 加密密钥的文件。我是不是可以这样理解,你需要定时的更新那个 key 文件,然后使用 ffmpeg 切片的时候开启这个参数? 不知道行不行。请给位大佬指点一二,先谢谢大家

    12 条回复    2019-01-19 18:50:39 +08:00
    jiangnanyanyu
        1
    jiangnanyanyu  
    OP
       2019-01-18 16:27:55 +08:00
    https://code.oxygene.sk/mirrors/ffmpeg/commit/eabeb9093abe0169a574945760ad3a26bf47cba4
    这是 ffmpeg gitlab 的 mirror 上有一个提交主题 vformat/hlsenc: allow dynamic encryption key rotation
    貌似是说支持动态的 key 加密的。
    watzds
        2
    watzds  
       2019-01-18 19:02:29 +08:00 via Android   ❤️ 9
    看标题还以为已经有大佬给你解决了
    jiangnanyanyu
        3
    jiangnanyanyu  
    OP
       2019-01-18 19:22:43 +08:00 via Android
    @watzds 没有啊,难受(╯﹏╰)
    jiangnanyanyu
        4
    jiangnanyanyu  
    OP
       2019-01-18 23:11:51 +08:00 via Android
    大佬们,都来说亲看法啊
    as9t
        5
    as9t  
       2019-01-18 23:45:25 +08:00
    其实楼主说的差不多了 未加密直接合成 加密的解密 key
    zbinlin
        6
    zbinlin  
       2019-01-19 00:20:07 +08:00
    就是用 periodic_rekey,明天详细答你
    asAnotherJack
        7
    asAnotherJack  
       2019-01-19 10:40:22 +08:00
    看标题还以为在说昨天那位女装大佬
    jiangnanyanyu
        8
    jiangnanyanyu  
    OP
       2019-01-19 10:52:16 +08:00 via Android
    @zbinlin 大佬,现在是明天了,真的不出来回答一下么😂
    jiangnanyanyu
        9
    jiangnanyanyu  
    OP
       2019-01-19 10:52:49 +08:00 via Android
    @asAnotherJack 哎,我的锅,起了个这个标题。。。
    guoluwei
        10
    guoluwei  
       2019-01-19 14:08:56 +08:00
    @jiangnanyanyu 明天永远不会到来
    zbinlin
        11
    zbinlin  
       2019-01-19 14:18:06 +08:00
    首先文档里说了,指定这个参数后,只要 hls_key_info_file 的内容定期刷新,就可以保证每个 Segment 使用不同的 key。

    所以我们只要改变这个文件的内容,并生成新的 key file 就可以了。

    那如何改变呢,由于 ffmpeg 在生成每个 Segment 并加密时,都会去读取一个 hls_key_info_file 的内容,因此我们可以写一个脚本,通过 inotify 监控这个文件,当文件被读取时,我们通过 inotify 通知获知后去更新这个文件,但由于这里需要原子操作,因此我们先生成一个临时文件,然后直接替换掉该文件就可以了。

    这里是一个简单的脚本:

    https://gist.github.com/zbinlin/c90f771b568d46be75875253b8d81bb4

    测试可以先运行这个脚本,然后使用 ffmpeg 来转码:

    ```
    ffmpeg -i example.mp4 -c:v h264 -hls_key_info_file file.keyinfo -hls_list_size 0 -hls_flags periodic_rekey -hls_time 10 out.m3u8
    ```
    jiangnanyanyu
        12
    jiangnanyanyu  
    OP
       2019-01-19 18:50:39 +08:00 via Android
    @zbinlin 谢谢你的耐心回复,刷新的脚本我用 python 写的,确实是这样。谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1469 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 17:18 · PVG 01:18 · LAX 09:18 · JFK 12:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.