標籤:基礎 sts a10 結構體 方式 nsarray 支援 參考資料 strong
原文:淺談iOS視頻開發
這段時間對視頻開發進行了一些瞭解,在這裡和大家分享一下我自己覺得學習步驟和資料,希望對那些對視頻感興趣的朋友有些協助。
一、iOS系統內建播放器
要瞭解iOS視頻開發,首先我們從系統內建的播放器說起,一、我們可以直接播放視頻,看到效果,不然搞了半天還播放不了視頻,會讓大家失去興趣。二、其實對於很多需求來說,系統的播放器就能夠勝任。簡單介紹下
1.MPMoviePlayerController
在iOS中播放視頻可以使用MPMoviePlayerController類來完成,具備一般的播放器控制功能,例如播放、暫停、停止等。但是MPMediaPlayerController自身並不是一個完整的視圖控制器,如果要在UI中展示視頻需要將view屬性添加到介面中
2.MPMoviePlayerViewController
MPMoviePlayerController繼承於UIViewController,預設是全螢幕模式展示、彈出後自動播放、作為模態視窗展示時如果點擊“Done”按鈕會自動結束模態視窗等
3.AVPlayer
MPMoviePlayerController足夠強大和複。自訂播放器的樣式,使用MPMoviePlayerController就不合適了,只能用AVPlayer.
AVPlayer本身並不能顯示視頻,而且它也不像MPMoviePlayerController有一個view屬性。如果AVPlayer要顯示必須建立一個播放器層AVPlayerLayer用於展示,播放器層繼承於CALayer,有了AVPlayerLayer之添加到控制器視圖的layer中即可。
4.AVFoundation
深入學習音視頻播放,需要對AVFoundation架構進行深入學習
但是無論是MPMoviePlayerController還是AVPlayer支援的視頻編碼格式很有限:H.264、MPEG-4,副檔名(壓縮格式):.mp4、.mov、.m4v、.m2v、.3gp、.3g2等。
二、使用第三方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上運行。
三、視頻基礎知識介紹
1.視頻播放器原理
- 通過流媒體協議如RTSP+RTP、HTTP、MMS等下載的資料通過解協議獲得封裝格式資料,何為封裝格式的資料。如AVI、MP4、FLV等;
- 對於封裝格式的資料進行解鎖裝,提取視頻流、音頻流、字幕流進行分離待下一步準備處理,
- 分離後獲得音視頻檔案編碼檔案(音視頻檔案過大需要進行壓縮排行傳輸,即編碼),常見的編碼如H.264編碼的視頻碼流和AAC編碼的音頻碼流。壓縮編碼的視頻資料輸出成為非壓縮的顏色資料,例如YUV420P,RGB等等;壓縮編碼的音頻資料輸出成為非壓縮的音頻抽樣資料,例如PCM資料。
- 視音頻同步,視頻流、音頻流、字幕流等進行同步播放。
2.流媒體傳輸協議
一般點播採用HTTP ,而直播的話,大部分還是採用RTMP或者私人協議,原因是延時會比較小,RTMP本身也是為了直播設計的
- RSVP:資源預留協議
- RTP:即時傳輸協議
- RTCP:即時傳輸控制通訊協定
- MMS:微軟流媒體服務協議
- RTSP:即時資料流傳輸協議
- MIME:多目網際網路電子郵件擴充協議
- RTMP(RTMPE/RTMPS/RTMPT):Adobe即時訊息協議簇
- RTMFP:Adobe實施訊息流程協議(P2P協議)
- HLS(Http Live Streaming)
流媒體協議介紹(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.播放方式
ApsaraVideo for Live,是對視頻源的即時的觀看,不能快進等操作,注重即時性,對網路延遲要求比較高,相當於視頻的廣播
ApsaraVideo for VOD,是對以往的視頻源進行回放,可以執行快進後退等操作
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)是固定不變的,一個音頻資料包可以存放幾個音訊框架,若是抽樣率是可變的,則一個資料包就只能存放一個音訊框架。
四、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
- 開啟網路流的話,前面要加上函數avformat_network_init()。
- AVFormatContext:統領全域的基本結構體。主要用於處理封裝格式(FLV/MKV/RMVB等)。AVFormatContext初始化方法avformat_alloc_context()
- 開啟輸入資料流,四個參數分別是ps:AVFormatContext對象的地址,filename:輸入資料流的檔案名稱,fmt:如果非空,這個參數強制一個特定的輸入格式。否則自動適應格式。int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
- 讀取資料包擷取流媒體檔案的資訊,每個AVStream儲存一個視頻/音頻流的相關資料;每個AVStream對應一個AVCodecContext,儲存該視頻/音頻流使用解碼方式的相關資料。int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
- 找到合適的解碼器,
- AVCodecContext *codecCtx = _formatCtx->streams[videoStream]->codec;AVCodec *codec = avcodec_find_decoder(codecCtx->codec_id);
- Initialize the AVCodecContext to use the given AVCodec. return zero on success, a negative value on error avcodec_open2(codecCtx, codec, NULL);
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的操作做鋪墊。
- 從 AVFormatContext讀取下一個AVPacket。int av_read_frame (AVFormatContext *s, AVPacket *pkt)
- 解碼從AVPacket *avpkt轉化為AVFrame *picture。。int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, const AVPacket *avpkt);
- 幀速控制attribute_deprecated int avpicture_deinterlace (AVPicture *dst, const AVPicture *src, enum AVPixelFormat pix_fmt, int width, int height)
- 返回frames的數組。
2.KxAudioManager
播放管理,例如paly,pause等,
3.KxMovieGLView
KxMovieDecoder提供解碼的API,在vedio解碼為YUV或者RGB檔案。KxMovieGLView利用OpenGLES(繪圖技術)呈現YUV檔案。
4.KxMovieViewController
使用以上API,構建播放器介面
五、總結
我的學習步驟
1.先學會使用系統的播放器進行視頻播放
2.學會使用第三方Kxmovie
學會這兩個,可以應付基本的視頻開發
3.深入學習AVFoundation架構 我買的這本書 AV Foundation開發秘籍:實踐掌握iOS & OS X 應用的視聽處理技術 我還沒看完
4.需要深入的話,需要多FFmpeg架構。當然需要先學習音視頻開發的基礎如RGB、YUV像素資料處理、PCM音頻採樣資料處理、H.264視頻碼流解析等等。好多啊。
六、參考資料匯總———也是我自己總結的大家深入學習的一些資料吧
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 應用的視聽處理技術
iOS 視頻開發學習