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

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

0.小结

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

1.简介

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

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

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

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
参考了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软硬解自适应?

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
主要参考了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解码器自适应软硬解方案内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部