分类目录归档:教程

ffmpeg 切片加密 手札

需要一个通用的KEY和一个IV
生成KEY

openssl rand -base64 20 > enc.key 

生成IV

openssl rand -hex 16

新建一个文件enc.keyinfo 内容格式如下:

Key URI # enc.key的路径,使用http形式
Path to key file # enc.key文件
IV # 上面生成的iv

播放是通过M3U8文件得到需要HTTP(即第一行的 Key URI)访问的key,然后取得key,进行解码访问。

http://edu.gamagou.cn/enc.key
/usr/share/nginx/html/enc.key
682f5033538cf71567e1bdb38f5f9a07

enc.keyinfo仅用于视频切片,可以多个视频都用一个文件进行切片

ffmpeg -y -i input.mp4 -hls_time 12 -hls_key_info_file enc.keyinfo -hls_playlist_type vod -hls_segment_filename "file%d.ts" playlist.m3u8

建议还是先转码后再切片。

ffmpeg 技术 HLS 手札

H.264 CRF 默认23
H.265 CRF 默认28

选项 参数 解释
-hls_time 数字 每隔一段时间切片
-hls_list_size 数字 0 则为不限制播放列表长度
-hls_segment_type fmp4 片段类型名 h.265值fmp4 使用fmp4时m3u8会出现一个#EXT-X-MAP:URI=”init.mp4″
-i 文件名 输入文件名
-f 输出类型 hls 输出类型
-hls_playlist_type 值vod 设置hls播放类型为点播放,该选项回将hls_list_size 设置为0
-crf 数值 压缩值 0为无损,23最好 ,30以上不建议选择
-c:a aac 设置音频编码aac 复制为copy参数
-c:v libx264 设置视频编码为h.264 复制为copy参数
-c:v libx265 设置视频编码为h.265
-hls_flags independent_segments 当确保播放列表中所有切片都以一个关键帧开始时,将#EXT-X-INDEPENDENT-SEGMENTS添加到播放列表中。
-hls_flags delete_segments 用于直播 自动删除旧的ts,只保留最新的几个
-hls_flags append_list 广告添加/HLS拼接 告诉 ffmpeg 添加到最后,而不是替换原文件。
-hls_flags split_by_time 告诉 ffmpeg 将切片时长尽量保证一至。(因为关键帧的存在) 可以使用+ 联合使用
-hls_segment_filename ac%6d.ts 用于在打包过程中为所创建的视频切片命名ac00000.ts ac00001.ts
-s 1920×1080 设置分辨率1920×1080
-r 30 设置fps为30 默认25
-b:a 128k 设置音频码率128k 与同类的copy不可以用
-b:v 2500k 设置视频码率平均2500k 与同类的copy不可以用
-maxrate 2675k 设置最大码率2675k
-maxrate 3000k 设置 bufsize 是为了让码率分布更均匀,设置的越小检查的频率越高,画质越差。一般设置 maxrate 的一到两倍之间
-ar 44100 音频采样频率 44100
-ac 2 音频通道数,2通道
-threads 0 自动根据计算机核心启用多线程
-g 60 关键帧最大间隔数 若30fps 2秒一切 则建议为60
-keyint_min 60 关键帧的最小间隔数正好关键帧的最小和最大间隔数
-sc_threshold 0 转换场景时不自动生成关键帧
-max_muxing_queue_size 1024 增大容器封装队列大小,用于处理 转码报错 Too many packets buffered for output stream 0:1.
-vf “scale=1280:-2” 转码视频保持1280的宽度,防止出现不被2整除的高度
-hls_key_info_file enc.keyinfo enc.keyinfo为key文件
hls_fmp4_init_filename init.mp4 设置fmp4下头文件 默认init.mp4

Nginx配合PHP简易鉴权-手札

PHP设置文件:

    if(strpos($_SERVER['HTTP_REFERER'],'explor')){
        header("Content-Type: application/octet-stream");
        header("X-Accel-Redirect: /hls/" . $_GET['file']);
    }

使用HTTP_REFFER中含有explor字段才可以内部跳转,这里可以加上SESSION或者COOKIE判断

Nginx 启用内部跳转:

    location /hls{
        internal;
        add_header Access-Control-Allow-Origin *;
        alias /home/wwwroot/your_web_path/public/video;
    }

默认直接访问/hls会被静止,必须使用内部跳转,然后重定向到资源位置 /home/wwwroot/your_web_path/public/video

ffmpeg 手札

安装
ffmpeg是一款处理视频的软件,包含常用的转码,截图等功能。

转码部分包含转换成我们常用的mp4格式,m3u8格式,m3u8+key格式。m3u8直播格式等

官网:https://ffmpeg.org/

安装方法很简单,以windows为例,下载ffmpeg放到任意文件夹里即可。需要注意的就是如果需要用到加密key的m3u8,则需要将ffmpeg添加到环境变量中。

比如您将ffmpeg安装在D盘下,添加到环境变量中的路径应该为:D:\ffmpeg\bin,关于怎么添加环境变量,请自行搜索教程

如果不安装到环境变量,则使用时需要点击系统>运行,输入cmd,调出cmd窗口,输入d:(回车),输入 cd ffmpeg(回车),下面就可以执行下面的命令进行转码操作

#ffmpeg的简单使用
一:将input.avi转换成output.mp4:

ffmpeg -i input.avi output.mp4

二:增加一些要求:

ffmpeg -threads 4 -i input.avi -ab 32 -flags +loop -vol 200 -vf yadif input.mp4

-ab:设置比特率

-vol:音量提高到200%

三:转码时修改尺寸:

ffmpeg -i input.avi -s 640×320 input.mp4

四:将视频转成m3u8点播文件

ffmpeg.exe -i input.avi -strict -2 -hls_time 10 -hls_list_size 0 -c:v libx264 -c:a aac -f hls input.m3u8

-hls_time 10:每个ts文件10秒左右。这个会根据具体情况,尽量维系在10秒一个ts

-hls_list_size 0:m3u8索引里保留所有的ts路径

五:将视频转成加密的m3u8点播文件

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -hls_time 10 -hls_list_size 0 -hls_key_info_file key_info input.m3u8

key_info需要替换成自己的路径,因为需要加密,所以需要准备二个文件一个是:key.key,一个是key_info。详细的不在这里作介绍,如果有兴趣可以看视频实际了解详细使用方法。

六:截图:

ffmpeg -ss 00:02:06 -i input.mp4 -f image2 -y poster.jpg

-ss:截图的时间点

七:连续截图:

ffmpeg -y -i input.mp4 -vf “fps=1/2,scale=iw/4:-1,tile=10×10” -an %d.png

fps=1/2:每2秒截一张图,如果是每秒截一张的话应该是fps=1

scale:所截图片大小,上面的代码是设置宽为原始的1/4大小,高度自动,相当于iw/4:ih/4,也可以设置成固定值如120:80

tile:网格化,自动将100张图合并成一张大图

八:连续截图的另外一个方法

ffmpeg -i my_dream.mp4 -vf fps=1/2 -q:v 2 -s 120×67 preview/%d.png

fps=1/2:每2秒截一张图,如果是每秒截一张的话应该是fps=1

-s:尺寸

这种方式截出来的是小图,需要自己再拼合。

转码:

ffmpeg -i input.mp4 -max_muxing_queue_size 1024 -vcodec libx264 -crf 28 -y -vf \"scale=1280:-2\" -acodec aac -ab 128k output.mp4

转码直接切片:h.264可以

ffmpeg -i 12.mp4 -vcodec copy -acodec copy -f hls -hls_time 3 -hls_list_size 0 -y m3u8

h.265
ffmpeg -y -i 12.mp4 -c copy -hls_segment_type fmp4 -hls_time 6 -hls_list_size 10 -hls_flags delete_segments+append_list+split_by_time  -hls_playlist_type vod 1.m3u8

需要再打磨 在ckplayer上可以使用

ffmpeg TS加密切片

新建一个记事本,取名enc.key(名字可以随便取)添加16个字节的秘钥,如

1234567890qwdcvf

新建一个文件,enc.keyinfo,添加如下内容

http://localhost:8080/enc.key
enc.key

改文件是告诉FFMPEG需要加密的文件位置,以及文件名
这里需要把enc.key和enc.keyinfo放在同一目录下

`ffmpeg -y \

-i test.mp4 \

-hls_time 12 \ # 将test.mp4分割成每个小段多少秒

-hls_key_info_file enc.keyinfo \

-hls_playlist_type vod \ # vod 是点播,表示PlayList不会变
-hls_segment_filename “file%d.ts” \ # 每个小段的文件名

playlist.m3u8 # 生成的m3u8文件`

播放时候 需要导入m3u8和相对应的enc.key 就可以播放了