一、为什么是IJKPlayer

在基础技术方面,后端有比較成熟的系统,就不再说了,这里说说client方面。

有直播就会有弹幕。基本上是标配了。
字幕方面bilibili开源了一个Android的项目,只是IOS却没有,这个仅仅能自己写了,只是本身这个东西技术方案没有什么太高深的东西。建立一个HTTP连接。不停地读数据就好了。假设关闭字幕,就把连接断掉。

在显示方面可能要考虑一些细节问题,像速度、位置、字数限制、之类的。

播放器方面,Android和IOS理论上是原生支持HLS播放的,只是实际应用过程中适配问题比較多。所以业内一般都使用bilibili开源出来的IJKPlayer,像斗鱼TV之类的都是自己基于IJKPlayer改造的,技术方案比較成熟。稳定性方面比較可靠,使用起来也非常easy,项目的编译脚本做的比較简单、灵活。

二、IJKPlayer的使用。

把项目Clone下来之后,首先要做的就是配置一下Codec,由于IJKPlayer使用ffmpeg做Codec,假设不裁剪一下。编出来的库会大的惊人。看一下config/module.sh,把不须要的codec注掉就OK了,我仅仅使用了aac、H264两种。

最后两个平台上面编出来都是大概有1M多。作为一个播放器来说,Size绝对非常小了。

Android眼下主流机器都支持ARMV7了,仅仅编这一种也足够了。对IOS来说。ARMV7、ARMV7s、ARM64这几种都得支持。调试时还须要使用i386,所以为了简单起见,測试阶段。我生成了支持ARMV7、ARMV7s、ARM64、i386这四种CPU架构的库,等到公布阶段再去掉i386架构的代码,进一步缩小包大小。

以下以IOS为例说一下整个编译过程。
1、改动config/module.sh。裁剪须要的codec等配置,把不用的去掉,降低终于生成的包大。
1、运行init-ios.sh,这里主要是下载ffmpeg的代码。

2、运行ios/compile-ffmpeg.sh,这里主要编译ffmpeg的代码。能够改动里面的配置来决定编译哪些CPU架构,可选的有arm7、arm7s、arm64、i386、386_64等。
3、编译完毕之后,打开IJKMediaPlayer,进行Build。IJKMediaPlayer是个.a项目。

Build时,IJKMediaPlayer的build setting中,Architectures和Valid Architectures两个设置项中的CPU架构列表都是armv7,armv7s,arm64这三种。

假设Schema中的target选择模拟器,则终于生成的.a库文件有i386,x86_64两个CPU架构的指令。把.a集成到我的项目中,使用xcodebuild进行打包时,会报找不到armv7,armv7s,arm64等几种架构指令的错误;假设Schema中的target选择iOS device。则终于生成的.a库文件仅仅有armv7、armv7s、arm64这几种CPU架构的指令,集成到我的项目中使用XCode进行编译时由于找不到i386架构的指令。也相同会报错。

最后使用lipo create。所以两个.a库文件进行Merge,问题解决,只是.a库比較大,仅仅好等公布时再把i386,x86_64两种CPU架构的指令裁剪掉了。

4、把编译生成的libIJKMediaPlayer.a。以及相应的include文件放到项目中就能够使用了。库文件和头文件的位置在这里:打开finder。在菜单中打开“前往”,按住Alt。点击菜单中出现的“资源库”。Developer->Xcode->DerivedData。找到IJKMediaPlayer打头的目录。点击进入。里面的每一个子目录分别相应Debug/Release、IOS设备/模拟器四种情况下生成的.a库和头文件。
5、.a文件生成时特别大。我这里有20多M。但项目总体打包后包大小仅仅添加了1M多。这个数字区别如此之大,着实让人惊讶。

大家知道老码农是好奇心最强的,把互联网翻得底朝天,终于确认了原因例如以下:

三、.a的压缩优化

1、编译优化选项没有设置,后来我在编译libIJKMediaPlayer.a时,对Build Setting中的优化项进行了设置(具体设置了些什么。看第六条)。生成的libIJKMediaPlayer.a到了7M+。

2、打包App时。会把.a和App中的代码进行Link。在Link完毕后会删除非常多.a中存在的在Link时使用的中间信息,当Link完毕之后这些信息就被删除了。

四、技术选型

关于直播实现方案的选择,以及HLS优缺点的具体分析。能够看下这篇文章:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html

五、生成.a时的CPU架构指令问题

IJKMediaPlayer编译时的CPU架构指令生成问题,能够參考这里:http://www.cocoachina.com/ios/20140915/9620.html
把两种CPU架构指令的.a文件进行Merge,能够參考这里:http://blog.sina.com.cn/s/blog_916e0cff0102vb9c.html

六、编译优化(Build Setting)

1、依照这两篇文章里提到的几种优化方式进行优化:
2、strip style在非app的project中使用non-global symbols。在appproject中使用all。
4、比較极端的情况下,也能够试试write link map file:http://blog.cnbang.net/tech/2296/
补充于2016.7.8
2015.6月份的iOS版在前几天运行时。发现偶尔有黑屏现象。场景是程序启动,播放第一个视频二、三十分钟后,退出再播放第二个视频。

拉取最新代码,编了tag为k0.5.1的版本号后,该问题没有再重现过。
另外,眼下播放器以framework的形式提供,接入时直接加入源代码中就OK。

假设使用Build Phase中加入二进制库的方式会出现framework no found的问题。

HLS直播技术方案及踩过的坑的更多相关文章

  1. Windows平台真实时毫秒级4K H264/H265直播技术方案

    背景 在刚提出4K视频的时候,大多数人都觉得没有必要,4K的出现,意味着更高的硬件规格和传输要求,1080P看的很爽.很清晰,完全满足了日常的需求.随着电视的尺寸越来越大,原本1080P成像已经无法满 ...

  2. 低延时的P2P HLS直播技术实践

    本文根据4月21日OSC源创会·武汉站的现场分享为蓝本,重新整理.以下是演讲内容: 近几年,随着直播.短视频等视频领域对带宽要求的提升以及CDN行业竞争的加剧,很多CDN公司开始往P2P-CDN方向发 ...

  3. 通用安防摄像机通过RTSP转RTMP推流进行H5(RTMP/HLS)直播的方案

    EasyNVR摄像机无插件直播方案 随着互联网的发展,尤其是移动互联网的普及,基于H5.微信的应用越来越多,企业也更多地想基于H5.微信公众号来快速开发和运营自己的视频及视频相关性产品,那么传统的安防 ...

  4. Angular i18n的技术分享、踩过的坑

    1.安装 npm @ngx-translate/core --save npm @ngx-translate/http-loader 2.配置(文本背景部分为该模块新增的)~app.module.ts ...

  5. Spring 4.2.2以上版本和swagger集成方案和踩过的坑

    因为公司使用的spring版本太高,在集成swagger的时候会存在一些问题,而网上的很多实例大多都是版本比较低的,为了是朋友们少才坑,我这边将集成的过程记录一下: 1. 引入spring.swagg ...

  6. HTTP Live Streaming直播(iOS直播)技术分析与实现

    本文转载自:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html 不经意间发现,大半年没写博客了,自觉汗颜.实则2012后半 ...

  7. 转: HTTP Live Streaming直播(iOS直播)技术分析与实现

    http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HTTP Live Streaming直播(iOS直播)技术分析与实现 ...

  8. 将海康大华等网络摄像机RTSP流进行网页Flash rtmp和H5 hls直播的技术方案

    前言 再小的技术点也会有他的市场! 一直以来,都有一些不被看好,认为是成本太高,无法大规模展开的软件和产品形态,就好比每一座城市都会有他的著名小吃一样,即使是慕名而来的人源源不断,受众群体也总是有限, ...

  9. 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解

    注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...

随机推荐

  1. word中选择嵌入式时图片被遮住,只显示小部分的解决方法

    选中图片,点击如下 选择  行距选项 将行距改为单位行距即可.

  2. oracle排序union和union all区别

    是这样的,表格中有几个属性,比如age吧是之一,age是字符类型的数字,select之间由union连接,此时是无法对前面的select语句进行order by的,也就是无法排序,无法达成我要的按ag ...

  3. PHP CURL的几种用法

    1.抓取无访问控制文件 <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://localhost/mytest/ ...

  4. 【Linux】swap分区简介及空间增加方式

    swap分区简介 Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存 ...

  5. IOS 监控网络变化案例源码

    随着移动网络升级:2G->3G->4G甚至相传正在研发的5G,网络速度是越来越快,但这流量也像流水一般哗哗的溜走. 网上不是流传一个段子:睡觉忘记关流量,第二天房子就归移动了! 这固然是一 ...

  6. DNN:windows使用 YOLO V1,V2

    本文有修改,如有疑问,请移步原文. 原文链接:  YOLO v1之总结篇(linux+windows) 此外:  YOLO-V2总结篇   Yolo9000的改进还是非常大的 由于原版的官方YOLOv ...

  7. 利用string 字符串拷贝

    序言:对于laws的代码,完全从Matlab中转来.其中用到了字符串复制和对比的函数. C++要求: 输入字符串,根据字符串,来确定选择数组,用于下一过程 MatLab代码: (1).文件calLaw ...

  8. Java_Reflect反射

    类是对象,类是java.lang.Class类的实例对象.There is a class named Class class Foo{} public class ClassDemo{ public ...

  9. ApplicationLoader登录失败

    报错:Please sign in with an app-specific password. You can create one at appleid.apple.com 是因为帐号开启了双重认 ...

  10. myeclipse中代码不显示SVN版本号

    打开 : windows ->preferences->General->Appearance->Lable Decoration s 勾选其中的 SVN 项即可. 如果以上方 ...