iOS:FFmpeg视频播放和直播框架

视频直播和播放转码器框架:FFmpeg是处理多媒体内容的库和工具的集合。例如音频,视频,字幕和相关的元数据。html

 

1、介绍:git

FFmpeg是一套能够用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。
它提供了录制、转换以及流化音视频的完整解决方案。它包含了很是先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里不少codec都是从头开发的。
FFmpeg在Linux平台下开发,但它一样也能够在其它操做系统环境中编译运行,包括Windows、Mac OS X等。这个项目最先由Fabrice Bellard发起,如今由Michael Niedermayer维护。
许多FFmpeg的开发人员都来自MPlayer项目,并且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"表明"Fast Forward"。
简单来讲,FFmpeg是一个免费的多媒体框架,能够运行音频和视频多种格式的录影、转换、流功能,能让用户访问几乎全部视频格式,包括mkv、flv、mov,VLC Media Player、Google Chrome浏览器都已经支持。github

 

2、详情:canvas

构成浏览器

一、libavfilter: 提供了一种经过滤波器链更改解码的音频和视频的方法,全部的音视频的后期滤镜处理都是由它完成的。服务器

二、libavformat:对多媒体格式的解析和封装。实现流协议,容器格式和基本I / O访问。网络

三、libavutil: 一些经常使用的工具,包括哈希,解压缩器和其余实用程序功能。框架

四、libpostproc:用于后期的效果处理ide

五、libavresample:移植的库,对音频进行重采样的工具

六、libswscale:对视频的操做,实现颜色转换和缩放例程。

七、libswresample:对音频的操做,实现音频混合和重采样例程。

八、libavdevice: 提供访问捕获和回放设备的抽象。对设备作处理的、如视频的采集,音频的采集、桌面的采集

九、libavcodec:提供了更多编解码器的实现。

[ffmpeg](https://ffmpeg.org/ffmpeg.html)是一个命令行工具箱,用于操做,转换和流式传输多媒体内容。

[ffplay](https://ffmpeg.org/ffplay.html)是一种简约的多媒体播放器。

[ffprobe](https://ffmpeg.org/ffprobe.html)是用于检查的简单分析工具多媒体内容。

[ffserver](https://ffmpeg.org/ffserver.html)是多媒体流服务器进行直播,通常用来搭建流媒体服务。

其余小工具,例如“ aviocat”,“ ismindex”和“ qt-faststart”。

//命令
ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers
built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda

默认的配置以下:
--enable-shared               启用shared
-enable-pthreads              启用pthreads
--enable-gpl                  启用gpl
--enable-version3             启用version3
-enable-hardcoded-tables      启用hardcoded-tables
--enable-avresample --cc=clang --host-cflags= --host-ldflags=     启用avresample
--enable-libmp3lame           启用libmp3lame 
--enable-libx264              启用libx264 
--enable-libxvid              启用libxvid
--enable-opencl               启用opencl
--disable-lzma                禁用lzma
--enable-vda                  启用vda

//使用格式
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

一、Getting help:
-h             打印基本选项
-h long        打印更多选项
-h full        打印全部选项(包括全部格式和编解码器特定的选项,很长)
-h type=name   打印命名解码器/编码器/解复用器/复用器/过滤器的全部选项

 
二、Print help / information / capabilities:(打印帮助/信息/功能:)
-L                 显示证书
-h topic           显示帮助
-? topic           显示帮助
-help topic        显示帮助
--help topic       显示帮助
-version           显示版本
-buildconf         显示构建配置
-formats           显示可用格式
-devices           显示可用设备
-codecs            显示可用的编解码器
-decoders          显示可用的解码器
-encoders          显示可用的编码器
-bsfs              显示可用的比特流过滤器
-protocols         显示可用的协议
-filters           显示可用的过滤器
-pix_fmts          显示可用的像素格式
-layouts           显示标准频道布局
-sample_fmts       显示可用的音频样本格式
-colors            显示可用的颜色名称
-opencl_bench      在全部OpenCL设备上运行基准测试并显示结果
-sources device    列出输入设备的来源
-sinks device      列出输出设备的接收器
-hwaccels          显示可用的硬件加速方法
 
三、Global options (affect whole program instead of just one file:(全局选项(影响整个程序,而不只仅是一个文件:))
-loglevel loglevel     设置日志记录级别
-v loglevel            设置日志记录级别
-report                生成报告
-max_alloc bytes       设置单个分配块的最大大小
-opencl_options        设置OpenCL环境选项
-y                     覆盖输出文件
-n                     永远不会覆盖输出文件
-ignore_unknown        忽略未知的流类型
-stats                 编码过程当中的打印进度报告
-max_error_rate        错误率(0.0:无错误,1.0:100%错误最大错误率)
-bits_per_raw_sample number  设置每一个原始样本的位数
-vol volume            更改音量(256 =正常)

四、Per-file main options: (每一个文件的主要选项:)
-f fmt                 强制格式
-c codec               编解码器名称
-codec codec           编解码器名称
-pre preset            预设名称
-map_metadata outfile[,metadata]:infile[,metadata]  设置infile中outfile的元数据信息
-t duration             记录或转码音频/视频的“持续时间”秒
-to time_stop           记录或转码中止时间
-fs limit_size          设置限制文件大小(以字节为单位
-ss time_off            设置开始时间偏移
-sseof time_off         设置相对于EOF的开始时间偏移
-seek_timestamp         使用-ss按时间戳启用/禁用查找
-timestamp time         设置录制时间戳(“如今”设置当前时间)
-metadata string=string 添加元数据
-program title=string:st=number...  添加具备指定流的程序
-target type           指定目标文件类型(带有可选前缀“ pal-”,“ ntsc-”或“ film-”的“ vcd”,“ svcd”,“ dvd”,“ dv”或“ dv50”)
-apad                  音垫
-frames number         设置要输出的帧数
-filter filter_graph   设置流filtergraph
-filter_script filename  从文件中读取流filtergraph描述
-reinit_filter           输入参数更改时从新初始化filtergraph
-discard                 丢弃
-disposition             部署

五、Video options:(视频选项:)
-vframes number         设置要输出的视频帧数
-r rate                 设置帧频(Hz值,分数或缩写)
-s size                 设置帧大小(WxH或缩写)
-aspect aspect          设置纵横比(4:三、16:9或1.333三、1.7777)
-bits_per_raw_sample number  设置每一个原始样本的位数
-vn                          禁用视频
-vcodec codec                强制视频编解码器(“复制”以复制流) 
-timecode hh:mm:ss[:;.]ff    设置初始TimeCode值。
-pass n                      选择通行证编号(1至3)
-vf filter_graph             设置视频过滤器
-ab bitrate                  音频比特率(请使用-b:a)
-b bitrate                   视频比特率(请使用-b:v) 
-dn                          禁用数据

六、Audio options:(音频选项:)
-aframes number          设置要输出的音频帧数
-aq quality              设置音频质量(特定于编解码器)
-ar rate                 设置音频采样率(以Hz为单位)
-ac channels             设置音频通道数
-an                      禁用音频
-acodec codec            强制音频编解码器(“复制”以复制流)
-vol volume              更改音量(256 =正常)
-af filter_graph         设置音频过滤器

七、Subtitle options:(字幕选项:)
-s size               设置帧大小(WxH或缩写)
-sn                   禁用字幕
-scodec codec         强制字幕编解码器(“复制”以复制流)
-stag fourcc/tag      强制字幕标签/ fourcc
-fix_sub_duration     修正字幕的持续时间
-canvas_size size     设置画布大小(WxH或缩写)
-spre preset          将字幕选项设置为指示的预设   

 

3、说明:

本demo中的FFmpeg已经编译过了,能够随意拖入到项目中,添加须要的库文件和框架就能够build success。
 

4、编译:

若是本机已经安装过FFmpeg,能够本身去下载脚本进行编译,而后将编译的文件集成到项目中。须要先下载编译脚本:https://github.com/kewlbear/FFmpeg-iOS-build-script。而后进入该文件目录,运行命令行./build-ffmpeg.sh。常见编译错误请挪步参考:https://www.jianshu.com/p/5d20e2a50faa。


5、拓展:

FFmpeg既有转码的功能,自己也具备视频媒介的特性,能够做为播放器使用。其实,ijkplayer是一个挺不错的视频直播和播放的框架。它仅仅使用FFmpeg进行视频的转码,本身做为一个播放器进行播放. ijkplayer框架集成能够看博客:http://www.cnblogs.com/XYQ-208910/p/5856815.html


6、演示:

在控制器中给出视频文件,点击按钮便可播放,显示帧数和时间

网络视频                      网络直播

     

github源码下载:https://github.com/xiayuanquan/FFmpegDemo