V2 的大佬超好!

2019-01-18 16:23:17 +08:00
 jiangnanyanyu

目前遇到一个使用 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 切片的时候开启这个参数? 不知道行不行。请给位大佬指点一二,先谢谢大家

4848 次点击
所在节点    程序员
12 条回复
jiangnanyanyu
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
2019-01-18 19:02:29 +08:00
看标题还以为已经有大佬给你解决了
jiangnanyanyu
2019-01-18 19:22:43 +08:00
@watzds 没有啊,难受(╯﹏╰)
jiangnanyanyu
2019-01-18 23:11:51 +08:00
大佬们,都来说亲看法啊
as9t
2019-01-18 23:45:25 +08:00
其实楼主说的差不多了 未加密直接合成 加密的解密 key
zbinlin
2019-01-19 00:20:07 +08:00
就是用 periodic_rekey,明天详细答你
asAnotherJack
2019-01-19 10:40:22 +08:00
看标题还以为在说昨天那位女装大佬
jiangnanyanyu
2019-01-19 10:52:16 +08:00
@zbinlin 大佬,现在是明天了,真的不出来回答一下么😂
jiangnanyanyu
2019-01-19 10:52:49 +08:00
@asAnotherJack 哎,我的锅,起了个这个标题。。。
guoluwei
2019-01-19 14:08:56 +08:00
@jiangnanyanyu 明天永远不会到来
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
2019-01-19 18:50:39 +08:00
@zbinlin 谢谢你的耐心回复,刷新的脚本我用 python 写的,确实是这样。谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/528345

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX