原文:浅谈iOS视频开发html
这段时间对视频开发进行了一些了解,在这里和你们分享一下我本身以为学习步骤和资料,但愿对那些对视频感兴趣的朋友有些帮助。git
1、iOS系统自带播放器github
要了解iOS视频开发,首先咱们从系统自带的播放器提及,1、咱们能够直接播放视频,看到效果,否则搞了半天还播放不了视频,会让你们失去兴趣。2、其实对于不少需求来讲,系统的播放器就可以胜任。简单介绍下vim
1.MPMoviePlayerController数组
在iOS中播放视频可使用MPMoviePlayerController类来完成,具有通常的播放器控制功能,例如播放、暂停、中止等。可是MPMediaPlayerController自身并非一个完整的视图控制器,若是要在UI中展现视频须要将view属性添加到界面中缓存
2.MPMoviePlayerViewController网络
MPMoviePlayerController继承于UIViewController,默认是全屏模式展现、弹出后自动播放、做为模态窗口展现时若是点击“Done”按钮会自动退出模态窗口等app
3.AVPlayer框架
MPMoviePlayerController足够强大和复。自定义播放器的样式,使用MPMoviePlayerController就不合适了,只能用AVPlayer.tcp
AVPlayer自己并不能显示视频,并且它也不像MPMoviePlayerController有一个view属性。若是AVPlayer要显示必须建立一个播放器层AVPlayerLayer用于展现,播放器层继承于CALayer,有了AVPlayerLayer之添加到控制器视图的layer中便可。
4.AVFoundation
深刻学习音视频播放,须要对AVFoundation框架进行深刻学习
可是不管是MPMoviePlayerController仍是AVPlayer支持的视频编码格式颇有限:H.26四、MPEG-4,扩展名(压缩格式):.mp四、.mov、.m4v、.m2v、.3gp、.3g2等。
2、使用第三方Kxmovie
1.配置Kxmovie
git clone https://github.com/kolyvan/kxmovie.git
cd kxmovie
git submodule update --init
sudo rake //会出现错误,见错误1
2.遇到的问题及解决办法:
a.执行sudo rake 时abort
在kxmovie目录下
执行vim Rakefile
找到SDK_VERSION、XCODE_PATH两行,改成下面
SDK_VERSION='9.2'
XCODE_PATH='/Applications/Xcode.app/Contents/Developer/Platforms'
解释:SDK_VERSION=‘9.2’中9.2是你如今的sdk版本能够执行
cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/developer/SDKs/
去查看目前的sdk的版本,改成对应的版本
b.Undefined symbols for architecture x86_64
Kxmovie应该是不支持64为模拟器上运行,不能够在iPhone5s以上模拟器上运行。能够在5上运行。
3、视频基础知识介绍
1.视频播放器原理
2.流媒体传输协议
通常点播采用HTTP ,而直播的话,大部分仍是采用RTMP或者私有协议,缘由是延时会比较小,RTMP自己也是为了直播设计的
流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357
视频流传输协议RTP/RTCP/RTSP/HTTP的区别 http://blog.csdn.net/yangxt/article/details/7467457
3.封装格式
封装格式(也叫容器)主要做用是把视频码流和音频码流按照必定的格式存储在一个文件中。
常见格式
AVI:微软在90年代初创立的封装标准,是当时为对抗quicktime格式(mov)而推出的,只能支持固定CBR恒定比特率编码的声音文件。
FLV:针对于h.263家族的格式。
MKV:万能封装器,有良好的兼容和跨平台性、纠错性,可带 外挂字幕。
MOV:MOV是Quicktime封装。
MP4:主要应用于mpeg4的封装 。
RM/RMVB:Real Video,由RealNetworks开发的应用于rmvb和rm 。
TS/PS:PS封装只能在HDDVD原版。
WMV:微软推出的,做为市场竞争。
4.编码标准
视频编码的主要做用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而下降视频的数据量。若是视频不通过压缩编码的话,体积一般是很是大的,一部电影可能就要上百G的空间。
视频编码标准汇总及比较 http://blog.csdn.net/leixiaohua1020/article/details/12031631
视音频编解码技术零基础学习方法 http://blog.csdn.net/leixiaohua1020/article/details/18893769
5.播放方式
视频直播,是对视频源的实时的观看,不能快进等操做,注重实时性,对网络延迟要求比较高,至关于视频的广播
视频点播,是对以往的视频源进行回放,能够执行快进后退等操做
6.FFmpeg
http://ffmpeg.org/doxygen/2.8/examples.html 官网介绍
http://blog.csdn.net/leixiaohua1020/article/details/44084321 博客地址
http://blog.csdn.net/beitiandijun/article/details/8280448 FFmpeg的基本概念
多媒体视频处理工具FFmpeg有很是强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
FFmpeg的基本概念:
容器(container):就是文件格式,在FFMPEG中,用来抽象文件格式的容器就是AVFormatContext;
数据流(stream):数据流就是咱们平时看到的多媒体数据流,它包含几种基本的数据流,包括:视频流、音频流、字幕流;按照个人理解,数据流在FFMPEG中的抽象为AVStream。
解复用器或者说分流器(demuxer):FFMPEG将要处理的多媒体文件当作多媒体数据流,先把多媒体数据流放入容器(AVFormatContext),而后将数据流送入解复用器(demuxer),demuxer在FFMPEG中的抽象为AVInputFormat,我更愿意把demuxer称为分流器,由于demuxer就是把交错的各类基本数据流识别而后分开处理,将分开的数据流分别送到视频、音频、字幕编解码器处理。
数据包(packet)固然分开的数据流在送往编解码器处理以前,要先放于缓存中,同时添加一些附属信息例如打上时间戳,以便后面处理,那么这个缓存空间就是数据包;因为数据流是在时间轴上交错放置,因此全部的视频、音频、字幕都被分割成一段一段的数据,这些一段段的数据从数据流中解析出来以后,就是存放在各自的packet,那么在这里要说明一下,单纯的视频数据包来讲,一个视频数据包能够存放一个视频帧,对于单纯的音频帧来讲,若是抽样率(sample-rate)是固定不变的,一个音频数据包能够存放几个音频帧,如果抽样率是可变的,则一个数据包就只能存放一个音频帧。
4、Kxmovie源码分析简易分析
总体思路是KxMovieDecoder经过视频文件或者网络地址使用FFmpeg解码,将视频文件解码为YUV或者RGB文件(图像文件)。而后KxMovieGLView呈现YUV或者RGB文件。KxAudioManager进行播放管理,例如paly,pause等,KxMovieViewController使用以上API,构建播放器界面
1.KxMovieDecoder文件
KxMovieDecoder提供解码的API,在vedio解码为YUV或者RGB文件。
从公共API入手,进行分析。如下分析只是提取了vedio的操做。
a.打开文件,进行以下操做
+ (id) movieDecoderWithContentPath: (NSString *) path error: (NSError **) perror
b. - (BOOL) openFile: (NSString *) path error: (NSError **) perror;
与方法a相比,方法a只是比此方法多了初始化方法 KxMovieDecoder *mp = [[KxMovieDecoder alloc] init];
c. - (void)closeFile;
结束
av_frame_free(&pFrame);
avcodec_close(pCodecCtx);
avformat_close_input(&pFormatCtx);
d. - (BOOL) setupVideoFrameFormat: (KxVideoFrameFormat) format;
枚举设置为 KxVideoFrameFormatRGB或者KxVideoFrameFormatYUV,
e.- (NSArray *) decodeFrames: (CGFloat) minDuration;
经过AVFormatContext对象读取frames。须要方法a的操做作铺垫。
2.KxAudioManager
播放管理,例如paly,pause等,
3.KxMovieGLView
KxMovieDecoder提供解码的API,在vedio解码为YUV或者RGB文件。KxMovieGLView利用OpenGLES(绘图技术)呈现YUV文件。
4.KxMovieViewController
使用以上API,构建播放器界面
5、总结
个人学习步骤
1.先学会使用系统的播放器进行视频播放
2.学会使用第三方Kxmovie
学会这两个,能够应付基本的视频开发
3.深刻学习AVFoundation框架 我买的这本书 AV Foundation开发秘籍:实践掌握iOS & OS X 应用的视听处理技术 我还没看完
4.须要深刻的话,须要多FFmpeg框架。固然须要先学习音视频开发的基础如RGB、YUV像素数据处理、PCM音频采样数据处理、H.264视频码流解析等等。好多啊。
6、参考资料汇总———也是我本身总结的你们深刻学习的一些资料吧
HTTP Live Streaming直播(iOS直播)技术分析与实现:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html
HTT Live Streaming官方文档:https://developer.apple.com/streaming/
FFmpeg深刻分析之零-基础 http://blog.chinaunix.net/uid-26611383-id-3976154.html
一篇大学论文,很长可是能让小白了解iOS流媒体都须要什么 http://www.doc88.com/p-7098896030363.html
流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357
视频流传输协议RTP/RTCP/RTSP/HTTP的区别 http://blog.csdn.net/yangxt/article/details/7467457
ffmpeg框架解读 http://blog.csdn.net/allen_young_yang/article/details/6576303
流媒体博客 http://blog.csdn.net/leixiaohua1020/article/details/15811977
http://blog.csdn.net/beitiandijun/article/details/8280448 FFmpeg的基本概念
视频编码标准汇总及比较 http://blog.csdn.net/leixiaohua1020/article/details/12031631
视音频编解码技术零基础学习方法 http://blog.csdn.net/leixiaohua1020/article/details/18893769
书籍:AV Foundation开发秘籍:实践掌握iOS & OS X 应用的视听处理技术