V2 的大佬超好! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jiangnanyanyu
V2EX    程序员

V2 的大佬超好!

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

    目前遇到一个使用 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 哎,我的锅,起了个这个标题。。。
    abai
        10
    abai  
       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     Solana     861 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 20:06 PVG 04:06 LAX 12:06 JFK 15:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86