淺談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.播放方式

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

視頻點播,是對以往的視頻源進行回放,可以執行快進后退等操作

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

  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,構建播放器界面

 

五、總結

 

我的學習步驟

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

 

七、水平有限,作者也是剛開始學習,肯定有很多不正確的地方,希望大家指正,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM