zoukankan      html  css  js  c++  java
  • HLS直播技术方案及踩过的坑


    一、为什么是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的问题。

  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7095571.html
Copyright © 2011-2022 走看看