原文:淺談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 應用的視聽處理技術