淺談iOS視頻播放的N種解決方案


 
100 作者 Maru 2016.03.22 20:46*
寫了4349字,被135人關注,獲得了207個喜歡

字數1621 閱讀2895 評論43 


header.jpeg

前言

雖然我不同意你的觀點 但我誓死捍衛你說話的權利!--伏爾泰

很長時間沒有寫文章了,這個題目其實我很早就想動筆寫了,因為從我第一個完整的APP項目開始,幾乎每一個APP都有視頻播放的需求,但是我卻遲遲不敢動筆,因為我覺得關於視頻播放的底層技術實現我還是一知半解。但還是寫下了這篇,希望路過的大神可以不吝賜教,也希望和我一樣正在進步的人可以有所收益,少走彎路,看完這篇文章以后可以選擇最適合自己的技術實現方案。

青銅時代

還記得剛學iOS的時候嗎?那個時候驚訝於各種牛逼的功能只需要幾句簡單的代碼就可以完成。視頻播放也是這樣,翻開幾本陳舊的iOS教材,你就可以在目錄里看到它。沒錯,它就是:

<MediaPlayer/MediaPlayer.h>

在MediaPlayer框架中,如果你足夠懶,那么利用MPMoviePlayerViewController你便可以三行代碼完成你的播放功能。然而,抬頭看看各大視頻APP,他們的播放界面是這樣的:


UC播放器.jpg

低頭看看自己的播放器,卻是這樣的:


藝術要求,請勿當真.png

媽蛋,好Low啊有木有,是可忍孰不可忍!好在Apple官方還給我們提供了一個類MPMoviePlayerController,通過這個類我們可以自定義播放器的UI,在這里推薦一款由國內工程師開源的基於MPMoviePlayerController播放器KRVideoPlayer,相信小伙伴們的大多數數的需求可以完美的解決。

工業時代

歷史的車輪滾滾向前,永不停歇、

然而MPMoviePlayerController自定義播放器並不是完美的:

  1. MPMoviePlayerController在iOS9被Apple廢棄了;
  2. 當我們的需求需要深度定制播放器的時候,MPMoviePlayerController就顯得力不從心了,比如筆者之前在做一個配音軟件時,需要只播放視頻的畫面,而不需要視頻的聲音,同時還需要開啟音頻的錄制,以及另開一個音頻播放器播放背景音效。這個時候,MPMoviePlayerController哭了。

鑒於<MediaPlayer/MediaPlayer.h>的局限性,新的框架應運而生--AVKit。

AVKit是建立在AVFoundation上,解決視頻播放的高級對象。從AVFoundation Programming Guide中我們可以看到這樣一張技術棧示意圖:


屏幕快照 2016-03-22 下午6.45.36.png

如果有人記得AVFoundation剛出那年的WWDC的話,一定對AVFoundation的性能表現印象深刻,同時播放100部視頻而絲毫不卡頓!在筆者的使用過程中也驗證了這一點,無論是對於本地視頻還是網絡在線點播,AVFoundation表現都異常優異。

我們先來看看AVKit的結構:


AVKit結構.png

由於本篇只是起一個“導購”的作用,而且關於AVKit的相關文章文檔多如牛毛因此便不再介紹。下面推薦幾個基於AVKit的第三方視頻框架:

  1. VKVideoPlayer
  2. ALMoviePlayerController
  3. PBJVideoPlayer

后工業時代

然而,凡事總會有一個然而,AVKit也並非完美無瑕,當我們需要播放一些非常規格式的視頻的時候(比如RMVB),AVKit又只能望洋興嘆了。

相信Mac用戶都很熟悉一款VLC播放器,這款播放器在Mac上表現異常優異,支持的格式幾乎涵蓋了所有格式(就是這么屌!)。沒錯,就是它創造者--VideoLAN,開源了一款牛逼的視頻播放框架MobileVLCKit!

我們先來看看它所支持的格式:

.rmvb .asf .avi .divx .dv .flv .gxf .m1v .m2v .m2ts .m4v .mkv .mov .mp2 .mp4 .mpeg .mpeg1 .mpeg2 .mpeg4 .mpg .mts .mxf .ogg .ogm .ps .ts .vob .wmv .a52 .aac .ac3 .dts .flac .m4a .m4p .mka .mod .mp1 .mp2 .mp3 *.ogg.

是不是很心動呢?那我們就開始吧!

1. 框架編譯

在Show you code之前,我們總需要先有它的庫吧?官方給出了詳細的教程,英文不好?翻牆網速不好?沒關系!這里有編譯完成的VLC框架,下載下來就好啦!

MobileVLCKit靜態庫下載鏈接

2.項目編譯

MobileVLCKit的靜態庫非常大,解壓下來以后差不多有600+MB,但是編譯之后只有幾M而已,所以放心使用吧。

  1. Linked Frameworks and Libraries中添加下載完成的MobileVLCKit;

  2. 添加依賴框架,MobileVLCKit依賴於以下的框架:


屏幕快照 2016-03-22 下午8.11.05.png
  1. 修改編譯選項,由於該框架底層由C++所編寫,所以我們需要更改相關的編譯選項;

6DF02A9C-7E7A-422F-BF69-41F381F2659B.png
  1. 修改Framework Search Paths,否則工程無法找到該框架;

CDFC9F51-D803-4376-A698-F29BDB542576.png

PS: "std::ios_base::Init::~Init()", referenced from
出現這樣的編譯問題,是需要再加進libstdc++.dylib和libstdc++.6.dylib(為6.1使用,xcode5以后默認complier也可以編譯通過)

OK!不錯意外的話,CMD + B編譯成功了!

為了拋磚引玉,獻上我自己基於MobileVLCKit寫的播放器:MRVLCPlayer,本來我只是想做一個Demo的,但是做着做着想做成一個框架,現在還有很多功能沒有完善,但是作為一個Demo應該是夠用了。


MRVLCPlayer.gif

信息時代

當然啦,如果你懂得一些視頻解碼更專業的知識,你還可以使用ffmpeglive555,這樣可以更加底層的學習視頻相關的技術。當然啦,博主現在也在學習這方面的知識,在此只是推薦給大家,順便悄悄的說一句,其實MobileVLCKit也是基於ffmpeg二次開發的。

石器時代后記

無論多么牛逼多么晦澀難懂的技術,最終的目的都是服務於人。人類從石器時代進化到如今,手中的工具換了一茬又一茬,一味的炫技沒有任何意義,選擇適合自己的工具才是正道。我相信,百分之九十以上的需求,在本文的信息時代之前都能解決,選擇權在你的手中。好了不說了,我要把我旁邊的母猿打暈拖進洞穴了,我們下次見~

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

¥ 打賞支持 
 

想問一下,關於視頻的極速,流暢,高清這些模式切換是怎么實現的,是請求三個不同的視頻鏈接嗎?

Maru: @MetaMay 確實是有這種實現方法的,比如超級輔助APP就是提供了三個鏈接來區分清晰度,還有就是通過中轉流服務器來進行清晰度的切換。

 

學習到了新的知識,謝謝分享!期待更多更好的文章!:smile:

正好要用,大謝!

樓主辛苦,謝謝

我技術小白,但你的文章很贊

學習了👍🏻👍🏻

比原生的好很多:smiley:

100

laizw

14 樓 · 2016.03.24 13:39

求第一個圖出處

100

談Xx

16 樓 · 2016.03.25 11:29

一直覺得視頻播放、視頻剪切之類的處理是一塊比較重要的地方。但是工作的項目都沒遇到過,抽空自己研究研究

加載更多 

登錄后發表評論

被以下專題收入,發現更多相似內容:
  • 180
    首頁投稿

    玩轉簡書的第一步,從這個專題開始。 想上首頁熱門榜么?好內容想被更多人看到么?來投稿吧!如果被拒也不要灰心哦~入選文章會進一個隊...

    58383篇文章 · 101939人關注

  • 180
    iOS Developer

    分享 iOS 開發的知識,解決大家遇到的問題,討論iOS開發的前沿,歡迎大家投稿~

    6341篇文章 · 19263人關注

  • 180
    iOS學習

    學習從點滴開始 ! (PS: 拒絕部分投稿的文章僅僅是由於專題內已收集相關知識點的文章, 並非是投稿的文章技術含量不夠好, 希望投稿...

    2694篇文章 · 3389人關注


免責聲明!

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



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