我是靠谱客的博主 美满世界,最近开发中收集的这篇文章主要介绍移动端android和ios解码器自适应软硬解方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    • 小结
    • 简介
    • 为什么我们需要去做软硬解自适应
    • 怎么样去做ios软硬解自适应
    • 怎么样去做android软硬解自适应

0.小结

之前因为项目需要,需要做软硬解自适应,看了很多项目,最后自己总结了下,终于做好了软硬解自适应,下面
下面我将这些思路分享出来。

1.简介

考虑到后面我们需要加大播放性能,比如播放全帧率1080P或者全帧率1080P以前的视频,这个时候,我
们就要采取硬解码的方式。但是如果要真正做的好,就要做到内部软硬解自适应,参考项目比较多,比如
ijkplayer和ios 项目iOS-H264_FFMpeg-VideoToolbox_VideoPlayer.

2.为什么我们需要去做软硬解自适应?

原因有很多,比如第三方对接,如果我们内部不做到软硬解自适应,那么会出现很多问题,比如底层开启
硬解码不成功,那么就不出图像了,又比如设备出的码流是H265,那么有些早期的手机就不能播放,这
个时候需要自动切换到软解码。

3.怎么样去做ios软硬解自适应?

参考了ios的项目ijkplayer,iOS-H264_FFMpeg-VideoToolbox_VideoPlayer,Kxmovie项目。发现
各有不同指出,其中ijkplayer做的最好。
解说ijkplayer
|----控件IJKGLVIEW基于UIView
|----控件创建的时候不会去创建opengl项目
|----开启播放的时候,如果上层配置硬解码,那么会去检测是否可以硬解码
|----如果发现可以,那么使用yuv420sp_vbt的opengl项目绘制
|----如果发现不能硬解码,那么自动切换软解码,绘制的时候使用yuv420p的opengl项目绘制
|----评价:性能强悍,软硬解效率高,自适应好
解说iOS-H264_FFMpeg-VideoToolbox_VideoPlayer
|----控件AAPLEAGLLayer基于CAEAGLLayer
|----这个控件其实不算控件,可以呗UIVIEW添加到自身的layer中
|----开启播放的时候,需要写死硬解码,如果硬解码成功,那么默认走yuv420sp_vbt的opengl项目
|----开启播放的时候,需要写死软解码,如果软解码成功,那么默认走yuv420sp_vbt的opengl项目,
需要转换YUV到CVPixelBufferRef, 再绘制,太耗性能
|----评价:硬解码时候性能强悍,软解码的时候性能差的要死,多次拷贝YUV数据
解说Kxmovie
|----控件KxmovieView基于UIView
|----开启播放的时候,只支持软解码
|----配置自身的CAEAGLLayer,实现YUV420P的opengl绘制
|----评价:软解码的性能强悍,是直接YUV420P格式绘制
总结Decoder
|----需要创建新控件GLView基于UIVIEW,具备创建的时候除了opengl项目,其他都初始化好
|----支持解码器判断到软解和硬解的时候,在绘制前配置好YUV420sp_vbt项目或者YUV420P项目
|----支持两种绘制,一种是软解传y,u,v数据,一种是传CVPixelBufferRef
|----支持码流发生变化的时候,主动删除opengl项目,自动切换到新的opengl项目
|----支持告知上层软解码或者硬解码模式
|----只在默认开启硬解码的前提下做软硬件自适应,不然就不支持

4.怎么样去做android软硬解自适应?

主要参考了android的项目ijkplayer,android_mediacodec_rtsp_h264,MediaCodecExample
er。ijkplayer做的最好但是不适合我当前项目。
解说ijkplayer
|----看了很多,但是不适用,原因是它是jni通过sdl绘制,暂时不深入
|----评价:性能强悍,软硬解效率高,自适应好
解说ijkplayer和android_mediacodec_rtsp_h264
|----控件集成surfaceview
|----使用流的方式,传给mediacodec,对我启发比较大
|----评价: 硬解码性能不错,没有软解码
总结Decoder:
|----控件GLView基于GLSurfaceView,创建的时候,设置绘制模式为自动绘制,创建texture和
surface
|----默认是创建opengl 硬解码模式的opengl项目
|----如果底层查到不支持硬解码,那么通知上层去设置YUV的缓存,然后YUV共享内存地址到底层
|----如果检测到不支持硬解码,在onDrawFrame中删除硬解码的opengl项目,建立新的opengl项目
|----支持码流发生变化的时候,主动删除opengl项目,自动切换到
新的opengl项目
|----支持告知上层软解码或者硬解码模式
|----只在默认开启硬解码的前提下做软硬件自适应,不然就不支持

最后

以上就是美满世界为你收集整理的移动端android和ios解码器自适应软硬解方案的全部内容,希望文章能够帮你解决移动端android和ios解码器自适应软硬解方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部