淺談iOS視頻開發

這段時間對視頻開發進行了一些瞭解,在這裏和你們分享一下我本身以爲學習步驟和資料,但願對那些對視頻感興趣的朋友有些幫助。html

1、iOS系統自帶播放器git

 

  要了解iOS視頻開發,首先咱們從系統自帶的播放器提及,1、咱們能夠直接播放視頻,看到效果,否則搞了半天還播放不了視頻,會讓你們失去興趣。2、其實對於不少需求來講,系統的播放器就可以勝任。簡單介紹下github

1.MPMoviePlayerControllervim

在iOS中播放視頻可使用MPMoviePlayerController類來完成,具有通常的播放器控制功能,例如播放、暫停、中止等。可是MPMediaPlayerController自身並非一個完整的視圖控制器,若是要在UI中展現視頻須要將view屬性添加到界面中數組

2.MPMoviePlayerViewController緩存

MPMoviePlayerController繼承於UIViewController,默認是全屏模式展現、彈出後自動播放、做爲模態窗口展現時若是點擊「Done」按鈕會自動退出模態窗口等網絡

3.AVPlayerapp

MPMoviePlayerController足夠強大和復。自定義播放器的樣式,使用MPMoviePlayerController就不合適了,只能用AVPlayer.框架

AVPlayer自己並不能顯示視頻,並且它也不像MPMoviePlayerController有一個view屬性。若是AVPlayer要顯示必須建立一個播放器層AVPlayerLayer用於展現,播放器層繼承於CALayer,有了AVPlayerLayer之添加到控制器視圖的layer中便可。tcp

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.視頻播放器原理

  • 經過流媒體協議如RTSP+RTP、HTTP、MMS等下載的數據經過解協議得到封裝格式數據,何爲封裝格式的數據。如AVI、MP四、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.播放方式

視頻直播,是對視頻源的實時的觀看,不能快進等操做,注重實時性,對網絡延遲要求比較高,至關於視頻的廣播

視頻點播,是對以往的視頻源進行回放,能夠執行快進後退等操做

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

  1. 打開網絡流的話,前面要加上函數avformat_network_init()。
  2. AVFormatContext:統領全局的基本結構體。主要用於處理封裝格式(FLV/MKV/RMVB等)。AVFormatContext初始化方法avformat_alloc_context()
  3. 打開輸入流,四個參數分別是ps:AVFormatContext對象的地址,filename:輸入流的文件名,fmt:若是非空,這個參數強制一個特定的輸入格式。不然自動適應格式。int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
  4. 讀取數據包獲取流媒體文件的信息,每一個AVStream存儲一個視頻/音頻流的相關數據;每一個AVStream對應一個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關數據。int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
  5. 找到合適的解碼器,
  6. AVCodecContext *codecCtx = _formatCtx->streams[videoStream]->codec;AVCodec *codec = avcodec_find_decoder(codecCtx->codec_id);
  7. 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的操做作鋪墊。

  1. 從 AVFormatContext讀取下一個AVPacket。int av_read_frame (AVFormatContext *sAVPacket *pkt)
  2. 解碼從AVPacket *avpkt轉化爲AVFrame *picture。。int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr,  const AVPacket *avpkt);   
  3. 幀速控制attribute_deprecated int avpicture_deinterlace (AVPicture *dst, const AVPicture *src, enum AVPixelFormat pix_fmt, int width, int height)      
  4. 返回frames的數組。

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 應用的視聽處理技術 

 

7、水平有限,做者也是剛開始學習,確定有不少不正確的地方,但願你們指正,謝謝。

相關文章
相關標籤/搜索