使用华为MediaCodec解码H264渲染TextureView延迟严重

Serious delay using Huawei MediaCodec decoding H264 rendering TextureView

"华为P30使用MediaCodec硬件解码H264码流,然后直接渲染到TextureView显示。"

发现相比其他手机phone平台,华为P30的延迟比其他手机phones长了200ms左右。

在配置使用MediaCodec的过程中,发现了一些Native fw层的错误日志,虽然可以正常解码渲染;

执行MediaCodec.configure(****)报如下错误:

D/SurfaceUtils: connecting to surface 0xc3a99808, reason connectToSurface
I/MediaCodec: [OMX.hisi.video.decoder.avc] setting surface generation to 33448961
D/SurfaceUtils: disconnecting from surface 0xc3a99808, reason connectToSurface(reconnect)
D/SurfaceUtils: connecting to surface 0xc3a99808, reason connectToSurface(reconnect)
E/ACodec: [OMX.hisi.video.decoder.avc] setPortMode on output to DynamicANWBuffer failed w/ err -2147483648
I/ACodec: [OMX.hisi.video.decoder.avc] got color aspects (R:2(Limited), P:1(BT709_5), M:1(BT709_5), T:3(SMPTE170M)) err=0 (NO_ERROR)
I/ACodec: [OMX.hisi.video.decoder.avc] got color aspects (R:2(Limited), P:1(BT709_5), M:1(BT709_5), T:3(SMPTE170M)) err=0 (NO_ERROR)
I/ACodec: [OMX.hisi.video.decoder.avc] using color aspects (R:2(Limited), P:1(BT709_5), M:1(BT709_5), T:3(SMPTE170M)) and dataspace 0x104

解码过程中出现如下警告:

I/ACodec: [OMX.hisi.video.decoder.avc] got color aspects (R:2(Limited), P:3(BT601_6_625), M:3(BT601_6), T:3(SMPTE170M)) err=0 (NO_ERROR)
I/ACodec: [OMX.hisi.video.decoder.avc] got color aspects (R:2(Limited), P:3(BT601_6_625), M:3(BT601_6), T:3(SMPTE170M)) err=0 (NO_ERROR)
I/ACodec: [OMX.hisi.video.decoder.avc] using color aspects (R:2(Limited), P:3(BT601_6_625), M:3(BT601_6), T:3(SMPTE170M)) and dataspace 0x102
I/ACodec: [OMX.hisi.video.decoder.avc] got color aspects (R:2(Limited), P:3(BT601_6_625), M:3(BT601_6), T:3(SMPTE170M)) err=0 (NO_ERROR)
I/ACodec: [OMX.hisi.video.decoder.avc] got color aspects (R:2(Limited), P:3(BT601_6_625), M:3(BT601_6), T:3(SMPTE170M)) err=0 (NO_ERROR)
I/ACodec: [OMX.hisi.video.decoder.avc] using color aspects (R:2(Limited), P:3(BT601_6_625), M:3(BT601_6), T:3(SMPTE170M)) and dataspace 0x102
D/SurfaceUtils: disconnecting from surface 0xc3a99808, reason setNativeWindowSizeFormatAndUsage
D/SurfaceUtils: connecting to surface 0xc3a99808, reason setNativeWindowSizeFormatAndUsage
D/SurfaceUtils: set up nativeWindow 0xc3a99808 for 720x1280, color 0x30d, rotation 0, usage 0X20002900
W/ACodec: [OMX.hisi.video.decoder.avc] setting nBufferCountActual to 11 failed: -2147483648"

这些日志与延迟无关。如果OMX.hisi.video.decoder.avc硬件解码器不支持某些配置,则打印日志,方便故障定位。

(比如加粗的DynamicAnwBuffer为端口配置,不支持则使用其他端口模式,不影响解码)

200ms的延迟不知道怎么算,可以分为H.264视频解码时间和渲染到TextureView的时间,。

解码延迟的获取,可以通过输入解码数据和获取解码输出时加入log来获取具体的时间差。 对比其他手机的时差,进一步分析时差。

此外,解码器和纹理配置(例如分辨率和帧率)也会影响性能。 或者,您也可以提供给研发工程师重现问题的方法进行分析。

感谢您的支持!