一、为什么是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. 微信小程序左右滑动切换页面示例代码--转载

    微信小程序——左右滑动切换页面事件 微信小程序的左右滑动触屏事件,主要有三个事件:touchstart,touchmove,touchend. 这三个事件最重要的属性是pageX和pageY,表示X, ...

  2. 9 在C#控制台程序(console)中让用户输入

    经过前面那些练习,我们已经熟悉录入一些简单的代码.这些代码可以进行一些简单的运算,在dos窗口打印出一些东西出来.我们现在要开始学习如何把数据从外部输入到我们的程序中. 其实大多数程序的工作是完成下面 ...

  3. asp.net MVC 路由注册

    1.命名空间的优先级 在路由注册时指定的命名空间比当前 ControllerBuilder 的默认命名空间具有更高的匹配优先级,但是对于这两个集合中的所有命名空间却具有相同的匹配优先级.换句话说,用于 ...

  4. CentOS 安装dotNetCore

    如果要在CentOS上运行.net Core程序,必须安装.net Core Sdk 具体安装 方法,可以参考微软官方站点说明,非常详细: 1)百度搜索 .Net Core 2)先择CentOS版本: ...

  5. 关于Core里的 StartUp里的方法的理解。

    public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; ...

  6. 【python】数组去重

    直接用set就行,比如: l = [1, 1, 2, 2, 3, 4, 5] s = set(l) c = [i for i in s] print c 结果为: [1, 2, 3, 4, 5] 其中 ...

  7. 4星|《OKR实践指南》:老司机经验谈

    OKR 实践指南:知乎任向晖.雷明灿作品 (知乎「一小时」系列) 作者所在的公司已经实施了OKR十个季度了.算是目前少有的OKR老司机.书中介绍的是作者的实践经验,在目前的OKR中文书中这本算是比较少 ...

  8. Arduino 控制超声波测距模块

    一.实物图 二.例子代码 用到数字2 和3 引脚,还有两个就是vcc GND两个阴脚,用模块连线比较简单

  9. UNIX SOCKET编程简介

    1  .  Layered Model of Networking Socket  编程的层次模型如下图所示,   最上面是应用层,应用层下面的是  SOCKET API  层,再下面是传输层和网络层 ...

  10. What is the difference between PKCS#5 padding and PKCS#7 padding

    The difference between the PKCS#5 and PKCS#7 padding mechanisms is the block size; PKCS#5 padding is ...