一、为什么是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. C#之纯数字判断

    public bool isNaN(string temp) { ; i <temp.Length; i++) { byte tempByte = Convert.ToByte(temp[i]) ...

  2. Objective-C—— Block

    OC Block 其实功能就类似C语言的函数指针,js中的闭包之类的.把代码块当做一个变量就行操作,有自己的变量和作用域. 简单看一下Block的语法和可能出现的问题: Block语法: block语 ...

  3. Java接口中的成员变量为什么必须声明为public static final?

    我想对于每个Java程序员来说,接口都不陌生,接口中的方法也经常使用.而接口中的成员变量,就显得用得少一点,而对于成员变量为什么必须声明为public static final,可能就更不清楚了,而且 ...

  4. 使用cnblogs发布第一篇文章,HelloWorld

    HelloWorld! 瞅瞅源码的样式,嗯,语法高亮还是可以的,辨识度还是挺高的. <!DOCTYPE html> <html> <head> <meta c ...

  5. 在命令提示符窗口下(cmd)使用指令操作并编译java代码,运行java编译代码

    使用cmd操作java代码,编译.java文件,运行.class文件. 操作步骤: 1:创建一个文件夹: 例如:在e盘根目录(\)下面创建一个名为Hello的文件夹: 使用md指令:如图 在e盘中会生 ...

  6. 3D模型在UI上显示的方法(Unity)

    方法:使用RawImage通过Render Texter将摄像机下的物体渲染纹理记录并显示在RawImage上面 具体实现:新建一个模型(Cube),新建一个摄像机,将Clear Flags设置为So ...

  7. PAT_A1115#Counting Nodes in a BST

    Source: PAT A1115 Counting Nodes in a BST (30 分) Description: A Binary Search Tree (BST) is recursiv ...

  8. scrapy-redis使redis不止保存url

    先看scrapy-redis源码 class RedisMixin(object): """Mixin class to implement reading urls f ...

  9. 【剑指Offer】41、和为S的连续正数序列

      题目描述:   小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数). ...

  10. RF学习使用记录【4】

    四 Extending Robot Framework 4.1 Creating test libraries RF的测试能力由测试库支持决定,已经有许多的测试库,有一些随着RF框架安装,但是更多的需 ...