Posted on 18 Jul 2018
FFmpeg使用说明
什么是FFmpeg
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 FFmpeg官网:https://ffmpeg.org
安装
// 1. Installing Free and Nonfree Repositories
$ sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm
// 2. enable EPEL
$ rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm
// 3. 第三方YUM源(Nux Dextop)
$ rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
$ rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
// 4. 安装
yum -y install ffmpeg ffmpeg-devel
功能
FFmpeg有非常强大的功能包括:视频采集、视频格式转化、视频截图、视频添加水印、视频切片(m3u8、ts)、视频录制、视频推流、更改音视频参数(编码方式、分辨率、码率、比特率等)功能,等等…
FFmpeg主要构成
FuncNames Features libavformat 用于各种音视频封装格式的生成和解析 libavcodec 用于各种类型声音/图像编解码 libavutil 包含一些公共的工具函数 libswscale 用于视频场景比例缩放、色彩映射转换 libpostproc 用于后期效果处理
FFmpeg常用参数
-
主要参数
-i 设定输入流 -f 设定输出格式
-
音频参数
-ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定则使用与输入流相同的编解码器 -an 不处理音频
-
视频参数
-b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定则使用与输入流相同的编解码器
命令分析
在使用hls技术播放视频流时,首先要把视频转换为ts片和一个m3u8播放列表,使用ffmpeg进行该转换时, 通常使用如下命令
-
命令1
$ ffmpeg -i 1.mp4 -c:v libx264 -preset ultrafast -qp 19 -c:a libfaac test.ts ---------------------------- 选项说明 ---------------------------- -i 输入文件,即原始视频文件; -c:v 指定视频流编码使用的编码器,这里指定为x264; -present 指定编码速度; -qp 指定画质,数值越小说明要求越高; -c:a 指定音频流编码使用的编码器,这里指定为faac; test.ts 指定输出文件文件名,必须以ts为后缀;
-
命令2
$ ffmpeg -re -i input.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://localhost:1935/rtmplive/test ---------------------------- 选项说明 ---------------------------- 对输入源 input.mp4 进行: libx264视频编码,aac音频编码,设定音频采样率44100,视频分辨率1280x720 输出格式:flv 推流至流媒体服务器地址:rtmp://localhost:1935/rtmplive/test
-
命令3
$ ffmpeg -i 1.mp4 -c:v libx264 -c:a copy -f hls -hls_time 60 -hls_list_size 0 ../output/test.m3u8 ---------------------------- 选项说明 ---------------------------- -i 输入文件,即原始视频文件 -c:v 指定视频流编码使用的编码器,这里指定为x264 -c:a 指定音频流编码使用的编码器,这里指定为copy,表示原始编解码数据必须被拷贝 ????? -f 强制文件格式, 此处为hls, 意思是Apple HTTP Live Streaming -hls_time n: 设置每片的长度,默认值为2。单位为秒 -hls_list_size n:设置播放列表保存的最多条目,设置为0会保存有所片信息,默认值为5 -hls_wrap n:设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.这个选项能够避免在磁盘上存储过多的 片,而且能够限制写入磁盘的最多的片的数量 -hls_start_number n:设置播放列表中sequence number的值为number,默认值为0 注意:播放列表的sequence number 对每个segment来说都必须是唯一的,而且它不能和片的文件名(当使用wrap选项时,文件名有可能会重复使用)混淆
FFmpeg分解视频文件并加密
-
生成key
$ openssl rand 16 > enc.key ( key: 生成一个enc.key文件 ) $ echo enc.key > enc.keyinfo $ openssl rand -hex 16 >>enc.keyinfo ( iv: 生成一段字符串,记下来)
enc.keyinfo文件格式
Key URI # enc.key的路径,使用http形式 Path to key file # enc.key文件 IV # 上面生成的iv
例子:
http://localhost/video/enc.key enc.key 48c674428c1e719751565ad00fe24243
-
分解并加密视频
$ 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文件