淺談iOS視頻開發

来源:http://www.cnblogs.com/booksky/archive/2016/02/24/5213198.html
-Advertisement-
Play Games

這段時間對視頻開發進行了一些瞭解,在這裡和大家分享一下我自己覺得學習步驟和資料,希望對那些對視頻感興趣的朋友有些幫助。 一、iOS系統自帶播放器 要瞭解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 應用的視聽處理技術 

 

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【原】FMDB源碼閱讀(二) 本文轉載請註明出處 —— polobymulberry-博客園 1. 前言 上一篇只是簡單地過了一下FMDB一個簡單例子的基本流程,並沒有涉及到FMDB的所有方方面面,比如FMDB的executeUpdate:系列方法、資料庫的加解密等等。這次寫的就是對FMDataba...
  • 註意:向客戶端寫數據時最後需要加上\n,不然很久都不會得到服務端的返回。 上面為普通的socket服務端,最近項目採用apache mina框架建後臺的socket服務端,採用上面的asyncSocket一直連接不上伺服器,也在網上查詢了大量的資料,最終發現需要如下: NSString *reque
  • 前兩篇文章 UIPickerView的使用(一) 、 UIPickerView的使用(二),學習了UIPickerView的單列選擇器和雙列選擇器的使用。 現在我們一起學習相互依賴的多列選擇器 1、遵守協議 2、創建pickView 3、實現協議 //UIPickerViewDataSource中定
  • 上篇文章 UIPickerView的使用(一) 學習瞭如何創建單列選擇器,現在看一下如何創建多列選擇器 多列選擇器(以二列為例) 1、遵守協議和創建兩個數據源 2、創建pickView 3、實現代理 //UIPickerViewDataSource中定義的方法,該方法的返回值決定該控制項包含的列數 -
  • 標題欄和狀態欄 Android程式預設情況下是包含狀態欄和標題欄的。 在Eclipse中新建一個Android程式,運行後顯示如下: 圖中標出了狀態欄(顯示時間、電池電量、網路等)和標題欄(顯示應用的名稱,即activity的android:label的屬性值)。 要隱藏標題欄和狀態欄,總體來說有兩
  • 1、首先先創建四個動畫文件 ①:left_in.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android
  • 簡介:UIPickerView是一個選擇器控制項,它比UIDatePicker更加通用,它可以生成單列的選擇器,也可生成多列的選擇器,而且開發者完全可以自定義選擇項的外觀,因此用法非常靈活。UIPickerView直接繼承了UIView,沒有繼承UIControl,因此,它不能像UIControl那樣
  • 一、問題在哪裡? textview顯示長文字時會進行自動折行,如果遇到一些特殊情況,自動折行會杯具成這個樣子: 上述特殊情況包括: 1)全形/半形符號混排(一般是數字、字母、漢字混排) 2)全形/半形標點符號出現在行首時,該標點符號會連同其前一個字元跳到下一行 3)英文單詞不能被折成兩行 4)...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...