作者 Maru2016.03.22 20:46*

写了4349字,被135人关注,获得了207个喜欢

字数1621 阅读2895 评论43 喜欢159

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之前,我们总需要先有它的库吧?官方给出了详细的教程,英文不好?FQ网速不好?没关系!这里有编译完成的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就是提供了三个链接来区分清晰度,还有就是通过中转流服务器来进行清晰度的切换。

 

学习到了新的知识,谢谢分享!期待更多更好的文章!

正好要用,大谢!

楼主辛苦,谢谢

我技术小白,但你的文章很赞

浅谈iOS视频播放的N种解决方案的更多相关文章

  1. 浅谈iOS视频开发

     浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...

  2. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  3. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

  4. 浅谈 iOS 与 H5 的交互- JavaScriptCore 框架

    前言 小的作为一个iOS程序猿,可能研究JavaScript以及H5相关的知识并不是为了真正的要去转行做这一方面,其实更多的为了要研究OC中的JavaScriptCore框架,JavaScriptCo ...

  5. 浅谈iOS多线程

    浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...

  6. []转帖] 浅谈Linux下的五种I/O模型

    浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html  一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...

  7. 浅谈boost.variant的几种访问方式

    前言 variant类型在C++14并没有加入,在cppreference网站上可以看到该类型将会在C++17加入,若想在不支持C++17的编译器上使用variant类型,我们可以通过boost的va ...

  8. iOS——浅谈iOS中三种生成随机数方法

    ios 有如下三种随机数方法:

  9. 浅谈iOS需要掌握的技术点

    鉴于很多人的简历中的技术点体现(很多朋友问我iOS需要知道注意哪些)! 技术点: 1.热更新 (及时解决线上问题) 2.runtime(json解析.数据越界.扩大button点击事件.拦截系统方法) ...

随机推荐

  1. G - MPI Maelstrom

    题目大意: BIT最近要取会他们的超级计算机,32处理器阿波罗奥德赛与分层通信子系统分布式共享内存的机器(听着很高端大气),瓦伦丁*麦基的顾问杰克*斯威特告诉她基准测试的新系统.(没有明白什么意思) ...

  2. Linux下profile environment bashrc的区别

        先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文.将/etc/profile 中的export LANG=zh_CN删除,将LNAG=z ...

  3. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  4. POJ3169 Layout(差分约束系统)

    POJ3169 Layout 题意: n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛 ...

  5. 两个有序数组的第n大数

    两个有序数组,各自含有n个元素,求第n大的元素 1.顺序遍历两个数组,计数变量k统计出现的第k小元素,时间复杂度为O(n) 代码例如以下: int getmid(int a[],int b[],int ...

  6. 洛谷比赛 Joe的数

    /* 开始暴力+滚动数组70 后来发现不用循环很多 找p的倍数 找%p意义下为0的就好了 */ #include<iostream> #include<cstdio> #inc ...

  7. C#解leetcode 11. Container With Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  8. Sublime Text插件之Emmet

    转载:http://www.w3cplus.com/tools/using-emmet-speed-front-end-web-development.html Emmet插件以前被称作为Zen Co ...

  9. DedeCms autoindex和itemindex使用介绍

    autoindex/itemindex 可以使用 @me+1;实现由指定数字开始,下面为大家详细介绍下具体的两者具体的用法,感兴趣的朋友可以参考下 代码如下: <span style=" ...

  10. (转)C#文件操作

    原文连接:http://www.cnblogs.com/wangshenhe/archive/2012/05/09/2490438.html 文件与文件夹操作主要用到以下几个类: 1.File类: 提 ...