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

V2 的大佬超好!

  •  
  •   jiangnanyanyu · 33 天前 · 2526 次点击
    这是一个创建于 33 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前遇到一个使用 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
        1
    jiangnanyanyu   33 天前
    https://code.oxygene.sk/mirrors/ffmpeg/commit/eabeb9093abe0169a574945760ad3a26bf47cba4
    这是 ffmpeg gitlab 的 mirror 上有一个提交主题 vformat/hlsenc: allow dynamic encryption key rotation
    貌似是说支持动态的 key 加密的。
        2
    watzds   33 天前 via Android   ♥ 9
    看标题还以为已经有大佬给你解决了
        3
    jiangnanyanyu   33 天前 via Android
    @watzds 没有啊,难受(╯﹏╰)
        4
    jiangnanyanyu   33 天前 via Android
    大佬们,都来说亲看法啊
        5
    as9t   33 天前
    其实楼主说的差不多了 未加密直接合成 加密的解密 key
        6
    zbinlin   33 天前
    就是用 periodic_rekey,明天详细答你
        7
    asAnotherJack   33 天前
    看标题还以为在说昨天那位女装大佬
        8
    jiangnanyanyu   33 天前 via Android
    @zbinlin 大佬,现在是明天了,真的不出来回答一下么😂
        9
    jiangnanyanyu   33 天前 via Android
    @asAnotherJack 哎,我的锅,起了个这个标题。。。
        10
    guoluwei   32 天前
    @jiangnanyanyu 明天永远不会到来
        11
    zbinlin   32 天前
    首先文档里说了,指定这个参数后,只要 hls_key_info_file 的内容定期刷新,就可以保证每个 Segment 使用不同的 key。

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

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

    这里是一个简单的脚本:



    测试可以先运行这个脚本,然后使用 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
    ```
        12
    jiangnanyanyu   32 天前 via Android
    @zbinlin 谢谢你的耐心回复,刷新的脚本我用 python 写的,确实是这样。谢谢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3384 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 05:19 · PVG 13:19 · LAX 21:19 · JFK 00:19
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1