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:
- senc:sample specific encryption data,特定加密数据样本。
- saio:sample auxiliary information offsets,样本辅助信息偏移量。
- 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字幕文件批量进行合并,应该怎么写?
(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,有何不一致需要改你再追问吧。
也可试试现成的工具。
以上是关于FFmpeg Mp4加解密的主要内容,如果未能解决你的问题,请参考以下文章
C#使用ffmpeg image2pipe将图片保存为mp4视频
C#使用ffmpeg image2pipe将图片保存为mp4视频
C#使用ffmpeg image2pipe将图片保存为mp4视频