HLS直播技术方案及踩过的坑


一、为什么是IJKPlayer

在基础技术方面,后端有比较成熟的系统,就不再说了,这里说说客户端方面。
有直播就会有弹幕,基本上是标配了。
字幕方面bilibili开源了一个Android的项目,不过IOS却没有,这个只能自己写了,不过本身这个东西技术方案没有什么太高深的东西,建立一个HTTP连接,不停地读数据就好了,如果关闭字幕,就把连接断掉。在显示方面可能要考虑一些细节问题,像速度、位置、字数限制、之类的。
播放器方面,Android和IOS理论上是原生支持HLS播放的,不过实际应用过程中适配问题比较多,所以业内一般都使用bilibili开源出来的IJKPlayer,像斗鱼TV之类的都是自己基于IJKPlayer改造的,技术方案比较成熟,稳定性方面比较可靠,使用起来也很简单,项目的编译脚本做的比较简单、灵活。

二、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、按照这两篇文章里提到的几种优化方式进行优化:
http://blog.cnbang.net/tech/2544/
http://m.blog.csdn.net/blog/lfr_dev/38442907
2、strip style在非app的工程中使用non-global symbols,在app工程中使用all。
3、对于Build Settings最详细的解释,当然还是官方文档了: https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/0-Introduction/introduction.html#//apple_ref/doc/uid/TP40003931-CH1-SW1
4、比较极端的情况下,也可以试试write link map file: http://blog.cnbang.net/tech/2296/

你可能感兴趣的:(HLS直播技术方案及踩过的坑)