• 请不要在回答技术问题时复制粘贴 AI 生成的内容
horou
V2EX  ›  程序员

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

  •  1
     
  •   horou · Aug 15, 2023 · 1704 views
    This topic created in 1032 days ago, the information mentioned may be changed or developed.

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

    Imgur

    vsyf
        1
    vsyf  
       Aug 16, 2023 via Android
    dequeue output buffer 的间隔太长。而且你也没做 av sync ,画面过快过慢都正常。
    horou
        2
    horou  
    OP
       Aug 16, 2023
    @vsyf 我这个时间设置多少都是一样的,而且我的是直播流,不需要做 sync
    vsyf
        3
    vsyf  
       Aug 16, 2023
    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
       Aug 16, 2023
    @vsyf 感谢您的解答,我这个需求就是解码有好快就播放多块,因为要做到延迟最低,编码推流的那边是做了画面速度保证的。
    今天已经找到原因了,是我是的 SurfaceView 通过 holder 获取的 Surface 进行渲染就会有这个问题,我估计是要么是安卓系统底层的问题,要么是这个设备芯片的问题,因为其他设备是没有这个问题的
    我现在是改成 TextureView 然后用过 TextureView 的 SurfaceTexture 创建 Surface ,之后在通过这个 Surface 进行渲染就没有这个问题了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5267 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 07:27 · PVG 15:27 · LAX 00:27 · JFK 03:27
    ♥ Do have faith in what you're doing.