​​​作者 ​​Maru ​

header.jpeg

前言

虽然我不同意你的观点 但我誓死捍卫你说话的权利!--伏尔泰

很长时间没有写文章了,这个题目其实我很早就想动笔写了,因为从我第一个完整的APP项目开始,几乎每一个APP都有视频播放的需求,但是我却迟迟不敢动笔,因为我觉得关于视频播放的底层技术实现我还是一知半解。但还是写下了这篇,希望路过的大神可以不吝赐教,也希望和我一样正在进步的人可以有所收益,少走弯路,看完这篇文章以后可以选择最适合自己的技术实现方案。

青铜时代

还记得刚学iOS的时候吗?那个时候惊讶于各种牛逼的功能只需要几句简单的代码就可以完成。视频播放也是这样,翻开几本陈旧的iOS教材,你就可以在目录里看到它。没错,它就是:

<MediaPlayer/MediaPlayer.h>

在MediaPlayer框架中,如果你足够懒,那么利用MPMoviePlayerViewController你便可以三行代码完成你的播放功能。然而,抬头看看各大视频APP,他们的播放界面是这样的:

浅谈iOS视频播放的N种解决方案_视频播放

UC播放器.jpg

低头看看自己的播放器,却是这样的:

浅谈iOS视频播放的N种解决方案_视频播放_02

艺术要求,请勿当真.png

妈蛋,好Low啊有木有,是可忍孰不可忍!好在Apple官方还给我们提供了一个类MPMoviePlayerController,通过这个类我们可以自定义播放器的UI,在这里推荐一款由国内工程师开源的基于MPMoviePlayerController播放器​​KRVideoPlayer​​,相信小伙伴们的大多数数的需求可以完美的解决。

工业时代

历史的车轮滚滚向前,永不停歇、

然而MPMoviePlayerController自定义播放器并不是完美的:

  1. MPMoviePlayerController在iOS9被Apple废弃了;
  2. 当我们的需求需要深度定制播放器的时候,MPMoviePlayerController就显得力不从心了,比如笔者之前在做一个配音软件时,需要只播放视频的画面,而不需要视频的声音,同时还需要开启音频的录制,以及另开一个音频播放器播放背景音效。这个时候,MPMoviePlayerController哭了。

鉴于<MediaPlayer/MediaPlayer.h>的局限性,新的框架应运而生--AVKit。

AVKit是建立在AVFoundation上,解决视频播放的高级对象。从AVFoundation Programming Guide中我们可以看到这样一张技术栈示意图:

浅谈iOS视频播放的N种解决方案_ios_03

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

如果有人记得AVFoundation刚出那年的WWDC的话,一定对AVFoundation的性能表现印象深刻,同时播放100部视频而丝毫不卡顿!在笔者的使用过程中也验证了这一点,无论是对于本地视频还是网络在线点播,AVFoundation表现都异常优异。

我们先来看看AVKit的结构:

浅谈iOS视频播放的N种解决方案_视频播放_04

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之前,我们总需要先有它的库吧?官方给出了详细的​​教程​​,英文不好?FQ网速不好?没关系!这里有编译完成的VLC框架,下载下来就好啦!

​MobileVLCKit静态库下载链接​

2.项目编译

MobileVLCKit的静态库非常大,解压下来以后差不多有600+MB,但是编译之后只有几M而已,所以放心使用吧。

  1. Linked Frameworks and Libraries中添加下载完成的MobileVLCKit;
  2. 添加依赖框架,MobileVLCKit依赖于以下的框架:

浅谈iOS视频播放的N种解决方案_视频播放_05

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

  1. 修改编译选项,由于该框架底层由C++所编写,所以我们需要更改相关的编译选项;

浅谈iOS视频播放的N种解决方案_ide_06

6DF02A9C-7E7A-422F-BF69-41F381F2659B.png

  1. 修改Framework Search Paths,否则工程无法找到该框架;

浅谈iOS视频播放的N种解决方案_视频播放_07

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

信息时代

当然啦,如果你懂得一些视频解码更专业的知识,你还可以使用​​ffmpeg​​​和​​live555​​,这样可以更加底层的学习视频相关的技术。当然啦,博主现在也在学习这方面的知识,在此只是推荐给大家,顺便悄悄的说一句,其实MobileVLCKit也是基于ffmpeg二次开发的。

石器时代后记

无论多么牛逼多么晦涩难懂的技术,最终的目的都是服务于人。人类从石器时代进化到如今,手中的工具换了一茬又一茬,一味的炫技没有任何意义,选择适合自己的工具才是正道。我相信,百分之九十以上的需求,在本文的信息时代之前都能解决,选择权在你的手中。好了不说了,我要把我旁边的母猿打晕拖进洞穴了,我们下次见~