关于 android 端视频 h264 硬解码问题

2023-08-15 14:39:12 +08:00
 horou

使用 android 端的 mediacodec 硬解,会出现一个奇怪的问题,程序运行在电视上,如果电视上背景有视频在播放时,然后立即唤起我的 app 开始解码视频就会出现画面非常缓慢的情况(使用 Surface 直接渲染的模式,不使用 Surface 模式直接渲染好像就没问题),如果是在电视一个背景是静态的页面,然后唤起我的 app ,就不会出现这种情况,播放很流畅。 两种情况 cpu 占用都是 10% 左右。 一开始我以为是硬件问题,但是另外一个使用 ijkplayer 的程序就没有这种问题。 这种到底是什么原因导致的呢,解码部分代码如下:

1114 次点击
所在节点    程序员
4 条回复
vsyf
2023-08-16 01:56:49 +08:00
dequeue output buffer 的间隔太长。而且你也没做 av sync ,画面过快过慢都正常。
horou
2023-08-16 09:56:05 +08:00
@vsyf 我这个时间设置多少都是一样的,而且我的是直播流,不需要做 sync
vsyf
2023-08-16 14:20:35 +08:00
dequeue output buffer 的间隔太长
=>这个看错了,那个是 dequeue 的 timeout 。(你这个是 rust 吗?没写过有点看不懂)

我这个时间设置多少都是一样的,而且我的是直播流,不需要做 sync
=> 即使你是直播流,也需要进行 AV SYNC , 甚至没有 audio ,你也需要对 system clock 。就像你的代码,一解码完就送去显示,如果解码够快,你可能看你的视频画面是加速播放的。

而对于你现在画面变慢的问题,同样要进行 AV SYNC ,将来的太晚的 frame 通过 release_output_buffer(output_buffer,false) 不进行渲染,尽快把 buffer 还回去,不要卡住整个流程。
horou
2023-08-16 14:30:41 +08:00
@vsyf 感谢您的解答,我这个需求就是解码有好快就播放多块,因为要做到延迟最低,编码推流的那边是做了画面速度保证的。
今天已经找到原因了,是我是的 SurfaceView 通过 holder 获取的 Surface 进行渲染就会有这个问题,我估计是要么是安卓系统底层的问题,要么是这个设备芯片的问题,因为其他设备是没有这个问题的
我现在是改成 TextureView 然后用过 TextureView 的 SurfaceTexture 创建 Surface ,之后在通过这个 Surface 进行渲染就没有这个问题了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/965465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX