目前遇到一个使用 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 切片的时候开启这个参数? 不知道行不行。请给位大佬指点一二,先谢谢大家
1
jiangnanyanyu OP https://code.oxygene.sk/mirrors/ffmpeg/commit/eabeb9093abe0169a574945760ad3a26bf47cba4
这是 ffmpeg gitlab 的 mirror 上有一个提交主题 vformat/hlsenc: allow dynamic encryption key rotation 貌似是说支持动态的 key 加密的。 |
2
watzds 2019-01-18 19:02:29 +08:00 via Android 9
看标题还以为已经有大佬给你解决了
|
3
jiangnanyanyu OP @watzds 没有啊,难受(╯﹏╰)
|
4
jiangnanyanyu OP 大佬们,都来说亲看法啊
|
5
as9t 2019-01-18 23:45:25 +08:00
其实楼主说的差不多了 未加密直接合成 加密的解密 key
|
6
zbinlin 2019-01-19 00:20:07 +08:00
就是用 periodic_rekey,明天详细答你
|
7
asAnotherJack 2019-01-19 10:40:22 +08:00
看标题还以为在说昨天那位女装大佬
|
8
jiangnanyanyu OP @zbinlin 大佬,现在是明天了,真的不出来回答一下么😂
|
9
jiangnanyanyu OP @asAnotherJack 哎,我的锅,起了个这个标题。。。
|
10
guoluwei 2019-01-19 14:08:56 +08:00
@jiangnanyanyu 明天永远不会到来
|
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 ``` |
12
jiangnanyanyu OP @zbinlin 谢谢你的耐心回复,刷新的脚本我用 python 写的,确实是这样。谢谢
|