FFmpeg:如何制作MP4 CENC(通用加密)视频

时间:2017-07-06 03:10:45

标签: video encryption ffmpeg video-encoding

使用ffmpeg进行CENC加密的正确语法是什么?

ffmpeg 3.0发行说明包括“通用加密(CENC)MP4编码和解码支持”,文件libavformat / movenccenc.h和libavformat / movenccenc.c似乎包括根据通用加密加密MP4文件所需的一切标准。

但是,我在ffmpeg手册页中找不到关于此主题的任何文档。

此致

2 个答案:

答案 0 :(得分:11)

Mulvya的回答涵盖了ffmpeg-options。

我只是添加一个具体的例子并谈论回放,因为我昨天做了一些实验(独立)。

加密示例

ffmpeg -i SampleVideo_1280x720_1mb.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 SampleVideo_1280x720_1mb_encrypted.mp4

(当然使用情况可能与您的情况有所不同;我只是重新调整了视频和音频)

播放/解码

ffplay

ffplay SampleVideo_1280x720_1mb_encrypted.mp4 -decryption_key 76a6c65c5ea762046bd749a2e632ccbb

但是,由于这或多或少是一个原型玩家,人们可能想要使用更强大的东西。

mpv

mpv --demuxer-lavf-o=decryption_key=76a6c65c5ea762046bd749a2e632ccbb SampleVideo_1280x720_1mb_encrypted.mp4

有一些讨论here,因为我的第一个预期命令行没有按预期运行!

编辑:试图解决Reino的问题

encryption_key只是128位= 16字节编码为十六进制(遵循AES-128-CTR的usage)。因此,random.org配置为16个字节并且hex.encoding将是有效密钥(但我并不建议通常信任外部资源)。我使用python' secrets module归结为:secrets.token_hex(16)。解码时需要encryption_key

encryption_kid Key ID只是此密钥的标识符,可能需要更复杂的使用模式(我猜测!你可以做类似的事情:嘿视频...我需要你的1000把钥匙中的哪一个?)。我认为通过它是强制性的,但解码时不需要它(如果你知道哪个键用于哪个视频)。

官方参考资料如下:

答案 1 :(得分:5)

运行ffmpeg -h muxer=mp4将为MP4复用器生成所有可用选项,其中包括

-encryption_scheme <string>     E....... Configures the encryption scheme, allowed values are none, cenc-aes-ctr
-encryption_key    <binary>     E....... The media encryption key (hex)
-encryption_kid    <binary>     E....... The media encryption key identifier (hex)

这些选项及其值应放在所有输入之后和输出文件名之前。