iOS:FFmpeg视频播放和直播框架
视频直播和播放转码器框架:FFmpeg是处理多媒体内容的库和工具的集合。例如音频,视频,字幕和相关的元数据。
一、介绍:
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浏览器都已经支持。
二、详情:
构成
1、libavfilter: 提供了一种通过滤波器链更改解码的音频和视频的方法,所有的音视频的后期滤镜处理都是由它完成的。
2、libavformat:对多媒体格式的解析和封装。实现流协议,容器格式和基本I / O访问。
3、libavutil: 一些常用的工具,包括哈希,解压缩器和其他实用程序功能。
4、libpostproc:用于后期的效果处理
5、libavresample:移植的库,对音频进行重采样的
6、libswscale:对视频的操作,实现颜色转换和缩放例程。
7、libswresample:对音频的操作,实现音频混合和重采样例程。
8、libavdevice: 提供访问捕获和回放设备的抽象。对设备做处理的、如视频的采集,音频的采集、桌面的采集
9、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}... 1、Getting help: -h 打印基本选项 -h long 打印更多选项 -h full 打印所有选项(包括所有格式和编解码器特定的选项,很长) -h type=name 打印命名解码器/编码器/解复用器/复用器/过滤器的所有选项 2、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 显示可用的硬件加速方法 3、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 =正常) 4、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 部署 5、Video options:(视频选项:) -vframes number 设置要输出的视频帧数 -r rate 设置帧频(Hz值,分数或缩写) -s size 设置帧大小(WxH或缩写) -aspect aspect 设置纵横比(4:3、16:9或1.3333、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 禁用数据 6、Audio options:(音频选项:) -aframes number 设置要输出的音频帧数 -aq quality 设置音频质量(特定于编解码器) -ar rate 设置音频采样率(以Hz为单位) -ac channels 设置音频通道数 -an 禁用音频 -acodec codec 强制音频编解码器(“复制”以复制流) -vol volume 更改音量(256 =正常) -af filter_graph 设置音频过滤器 7、Subtitle options:(字幕选项:) -s size 设置帧大小(WxH或缩写) -sn 禁用字幕 -scodec codec 强制字幕编解码器(“复制”以复制流) -stag fourcc/tag 强制字幕标签/ fourcc -fix_sub_duration 修正字幕的持续时间 -canvas_size size 设置画布大小(WxH或缩写) -spre preset 将字幕选项设置为指示的预设
三、说明:
本demo中的FFmpeg已经编译过了,可以随意拖入到项目中,添加需要的库文件和框架就可以build success。
四、编译:
如果本机已经安装过FFmpeg,可以自己去下载脚本进行编译,然后将编译的文件集成到项目中。需要先下载编译脚本:https://github.com/kewlbear/FFmpeg-iOS-build-script。然后进入该文件目录,运行命令行./build-ffmpeg.sh。常见编译错误请挪步参考:https://www.jianshu.com/p/5d20e2a50faa。
五、拓展:
FFmpeg既有转码的功能,本身也具有视频媒介的特性,可以作为播放器使用。其实,ijkplayer是一个挺不错的视频直播和播放的框架。它仅仅使用FFmpeg进行视频的转码,自己作为一个播放器进行播放. ijkplayer框架集成可以看博客:http://www.cnblogs.com/XYQ-208910/p/5856815.html
六、演示:
在控制器中给出视频文件,点击按钮即可播放,显示帧数和时间
网络视频 网络直播
github源码下载:https://github.com/xiayuanquan/FFmpegDemo