FFmpeg Mp4加解密

Posted 音视频开发老马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg Mp4加解密相关的知识,希望对你有一定的参考价值。

基础知识

通过FFmpeg解封装或者封装Mp4容器时,可以进行解密或者加密,这是MP4容器提供的能力。

  • libavformat/movenc.c:提供了mov、3gp、mp4、psp、3g2、ipod、ismv和f4v的Muxer。
  • libavformat/mov.c:提供了mov、mp4、m4a、3gp、3g2和mj2的Demuxer。

针对加密,libavformat/movenc.c提供了三个参数:

 "encryption_scheme",    "Configures the encryption scheme, allowed values are none, cenc-aes-ctr", offsetof(MOVMuxContext, encryption_scheme_str),   AV_OPT_TYPE_STRING, .str = NULL, .flags = AV_OPT_FLAG_ENCODING_PARAM ,
 "encryption_key", "The media encryption key (hex)", offsetof(MOVMuxContext, encryption_key), AV_OPT_TYPE_BINARY, .flags = AV_OPT_FLAG_ENCODING_PARAM ,
 "encryption_kid", "The media encryption key identifier (hex)", offsetof(MOVMuxContext, encryption_kid), AV_OPT_TYPE_BINARY, .flags = AV_OPT_FLAG_ENCODING_PARAM ,

加密时,需要指定上面三个参数。

针对解密,libavformat/mov.c提供了一个参数:

 "decryption_key", "The media decryption key (hex)", OFFSET(decryption_key), AV_OPT_TYPE_BINARY, .flags = AV_OPT_FLAG_DECODING_PARAM 

解密时,只要指定一个decryption_key就可以了。

命令行操作

加密一个文件:

ffmpeg -i decryption.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key c7e16c4403654b85847037383f0c2db3 -encryption_kid a7e61c373e219033c21091fa607bf3b8 encryption.mp4

播放加密的mp4文件:

ffplay -i encryption.mp4 -decryption_key c7e16c4403654b85847037383f0c2db3

针对加密的mp4文件,解密出一个未加密文件:

ffmpeg -decryption_key c7e16c4403654b85847037383f0c2db3 -i encryption.mp4 decryption.mp4

代码实现

加密:

AVDictionary *opts = NULL;
// 指定加密参数
av_dict_set(&format_opts, "encryption_scheme", "cenc-aes-ctr", 0);
av_dict_set(&format_opts, "encryption_key", "c7e16c4403654b85847037383f0c2db3", 0);
av_dict_set(&format_opts, "encryption_kid", "a7e61c373e219033c21091fa607bf3b8", 0);
ret = avformat_write_header(AVFormatContext, &format_opts);

解密:

AVDictionary *format_opts = NULL;
// 指定解密key
av_dict_set(&format_opts, "decryption_key", "c7e16c4403654b85847037383f0c2db3", 0);
err = avformat_open_input(&AVFormatContext, "path", AVInputFormat, &format_opts);

Box差异

加密前的Mp4 Box:

加密后的Mp4 Box:

相比于原始文件,加密文件在stbl下新增加了3个box:

  1. senc:sample specific encryption data,特定加密数据样本。
  2. saio:sample auxiliary information offsets,样本辅助信息偏移量。
  3. saiz:sample auxiliary information sizes,样本辅助信息大小。

批处理使用ffmpeg为mp4批量加入字幕

我有多个mp4视频,名字比较乱没有规律性,有中文、数字、字母、连接线、下划线等,而且我也整理好了同名的srt字幕和ass字幕,现在自己已经可以成功的使用ffmpeg将单个mp4视频直接拷贝与同名srt字幕合并成内嵌“time text(sbtl)”字幕:
"D:\\ffmpeg\ffmpeg-20150702-git-03b2b40-win32-static\bin\ffmpeg.exe" -i 15613Bowe.mp4 -f srt -i 15613Bowe.srt -c:v copy -c:a copy -c:s mov_text 15613vbm_new.mp4
现在需要实现:
批处理将文件夹中全部mp4文件与同名srt文件合并,生成相同名字的mp4文件并保存到F盘下的“视频整理”文件夹;
如果我要将mp4文件与同名ass字幕文件批量进行合并,应该怎么写?

@echo off
(for /f "tokens=*" %%i in ('dir/b *.mp4') do (
echo "D:\\\\ffmpeg\\ffmpeg-20150702-git-03b2b40-win32-static\\bin\\ffmpeg.exe" -i   %%i -f srt -i %%~ni.srt -c:v copy -c:a copy -c:s mov_text %%~ni_new.mp4))>加字幕.bat

 你先用记事本打开生成的 " 加字幕.bat " 看一下,是不是与你手工输入时格式一致,一致就运行这个bat,有何不一致需要改你再追问吧。

参考技术A

也可试试现成的工具。

以上是关于FFmpeg Mp4加解密的主要内容,如果未能解决你的问题,请参考以下文章

C#使用ffmpeg image2pipe将图片保存为mp4视频

C#使用ffmpeg image2pipe将图片保存为mp4视频

C#使用ffmpeg image2pipe将图片保存为mp4视频

不用FFMpeg,用Python代码解密ts文件还原mp4视频(前提:有正确的key)

ffmpeg命令 从网络摄像头录制视频

解码M3U8在线流视频AES-128解密TS合并到MP4