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

Rol*_*anc 10 encryption video ffmpeg video-encoding

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

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

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

问候

sas*_*cha 12

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
Run Code Online (Sandbox Code Playgroud)

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

播放/解码

ffplay

ffplay SampleVideo_1280x720_1mb_encrypted.mp4 -decryption_key 76a6c65c5ea762046bd749a2e632ccbb
Run Code Online (Sandbox Code Playgroud)

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

MPV

mpv --demuxer-lavf-o=decryption_key=76a6c65c5ea762046bd749a2e632ccbb SampleVideo_1280x720_1mb_encrypted.mp4
Run Code Online (Sandbox Code Playgroud)

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

编辑:试图解决Reino的问题

encryption_key是编码为十六进制只是128位= 16个字节(跟随使用 AES-128-CTR的).因此random.org为16个字节,hex.encoding的配置将是一个有效的密钥(但我不建议一般相信外部资源).我使用了python的秘密模块,归结为:secrets.token_hex(16).这encryption_key将是解码所必需的.

encryption_kid 密钥ID就是这个关键的标识符,可能需要更复杂的使用图案(我猜你可以这样做:! ?哎视频......其中我1000把钥匙我需要你).我认为必须通过它,但解码不需要(如果您知道哪个键用于哪个视频).

官方参考文献是:

  • 标准
  • ffmpeg实现:docs(可通过命令行获得)或简短提取


Gya*_*yan 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)
Run Code Online (Sandbox Code Playgroud)

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