一、为什么是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. android 可拖动控件 ontouchevent

    首先附上文章的转载内容的链接: 学习android 可拖动事件首先需要对android的屏幕和touchevent参数建立一个详细的知识结构. 1.android坐标系统 一.首先明确一下 andro ...

  2. RabbitMQ 官方NET教程(五)【Topic】

    在上一个教程中,我们改进了我们的日志记录系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fanout那样,只能够无脑的转发 虽然使用direct类型改进了我们的系统, ...

  3. windows下查看端口进程占用情况

    引用:http://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html 我们在启动应用的时候经常发现我们需要使用的端口被别的程序占用,但是我 ...

  4. 项目平台统一(前后端IDE、代码风格)

    项目平台统一(前后端IDE.代码风格) 记录人:娄雨禛 前端:Webstorm(HTML+CSS+JavaScript) 后端:IntelliJ IDEA(Java) 代码风格:Java风格代码 代码 ...

  5. 控制台输入年龄,根据年龄输出不同的提示 ------if……else if ……else 语句

    package com.zuoye.test; import java.util.Scanner; public class Nianling { public static void main(St ...

  6. 【技术累积】【点】【sql】【17】了解索引

    先上结论 数据库数据以平衡树进行聚合索引--主键的作用: 数据每行都存在叶子节点: 单独字段的索引,单独存在,且将该字段值取出: 单独字段的索引,查到对应的主键id,再通过聚合索引查到数据: 多字段索 ...

  7. H5网页涂鸦canvas

    最近做了个播放页面,标题和一个iframe;需要对这个iframe可以进行网页涂鸦.网页涂鸦肯定是canvas了.网上找了个差不多的,实验下来问题很多,干脆自己一步步修改,学习. 效果: 本项目没有引 ...

  8. DFS-BFS深度优选遍历和广度优先遍历

    https://www.jianshu.com/p/b086986969e6 DFS--需要借助stack实现 stack.push stack.pop BFS--需要借助队列queue stack- ...

  9. Python 文件操作 day2

    一.打开文件的模式1:读.写.追加 1.r读:读模式,只能读,不能写,打开不存在的文件会报错:可省略'r',因为不写默认是读模式 f = open('filename',encoding='utf-8 ...

  10. 有关微信小程序

    每个页面都要在app.json中配置 "pages": [ "pages/index/index", "pages/list/list", ...