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常用参数

命令分析

在使用hls技术播放视频流时,首先要把视频转换为ts片和一个m3u8播放列表,使用ffmpeg进行该转换时, 通常使用如下命令

  1. 命令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. 命令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. 命令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分解视频文件并加密

  1. 生成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
    
  2. 分解并加密视频

     $ 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文件