V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
horou
V2EX  ›  程序员

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

  •  1
     
  •   horou · 2023-08-15 14:39:12 +08:00 · 1130 次点击
    这是一个创建于 491 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    Imgur

    vsyf
        1
    vsyf  
       2023-08-16 01:56:49 +08:00 via Android
    dequeue output buffer 的间隔太长。而且你也没做 av sync ,画面过快过慢都正常。
    horou
        2
    horou  
    OP
       2023-08-16 09:56:05 +08:00
    @vsyf 我这个时间设置多少都是一样的,而且我的是直播流,不需要做 sync
    vsyf
        3
    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
        4
    horou  
    OP
       2023-08-16 14:30:41 +08:00
    @vsyf 感谢您的解答,我这个需求就是解码有好快就播放多块,因为要做到延迟最低,编码推流的那边是做了画面速度保证的。
    今天已经找到原因了,是我是的 SurfaceView 通过 holder 获取的 Surface 进行渲染就会有这个问题,我估计是要么是安卓系统底层的问题,要么是这个设备芯片的问题,因为其他设备是没有这个问题的
    我现在是改成 TextureView 然后用过 TextureView 的 SurfaceTexture 创建 Surface ,之后在通过这个 Surface 进行渲染就没有这个问题了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5528 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:42 · PVG 14:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.