Android 媒体编解码器 : How many simultaneous (video) decoding threads are supported on multiple SurfaceViews?

标签 android android-mediacodec

来自 Grafika项目,文件 DoubleDecodeActivity.java。我在 3 个 SurfaceView 上使用 MediaCodec API 尝试了 3 个同步视频 (h264) 解码器。在使用 Android 5.1 将第 4 个解码器添加到第 4 个 SurfaceView 到 Nexus 7 时崩溃,那么可能或支持多少个同步解码器。

附言。这次崩溃后,MediaCodec 不再工作。需要重启设备才能使用MediaCodec。

下面是崩溃日志。在第 4 个解码器线程的 decoder.start() 函数处崩溃。

com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one W/ACodec: do not know color format 0x7fa30c03 = 2141391875
com.example.app.one W/ACodec: do not know color format 0x7fa30c03 = 2141391875
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one W/ACodec: do not know color format 0x7fa30c03 = 2141391875
com.example.app.one W/ACodec: do not know color format 0x7fa30c03 = 2141391875
com.example.app.one E/ACodec: registering GraphicBuffer 9 with OMX IL component failed: -2147483648
com.example.app.one V/PlayerFromFileThread: inputBuffer not available.
com.example.app.one E/ACodec: Failed to allocate buffers after transitioning to IDLE state (error 0x80000000)
com.example.app.one E/ACodec: signalError(omxError 0x80001001, internalError -2147483648)
com.example.app.one V/PlayerFromFileThread: inputBuffer not available.
com.example.app.one E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 5
? E/ACodec: registering GraphicBuffer 4 with OMX IL component failed: -2147483648
? E/AndroidRuntime: FATAL EXCEPTION: Thread-485
                                                   Process: com.example.app.one, PID: 17143
                                                   android.media.MediaCodec$CodecException: start failed
                                                       at android.media.MediaCodec.native_start(Native Method)
                                                       at android.media.MediaCodec.start(MediaCodec.java:612)
                                                       at com.example.app.one.MainActivity$PlayerFromFileThread.run(MainActivity.java:1921)
? E/ACodec: Failed to allocate buffers after transitioning to IDLE state (error 0x80000000)
? E/ACodec: signalError(omxError 0x80001001, internalError -2147483648)
? E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 5

最佳答案

这有点不好定义。

在 API 23 中,MediaCodecInfo getMaxSupportedInstances()添加了方法,它大胆地声称,“这是一个上限的提示。”

固定定义这个值的麻烦在于,硬件实例的数量可能会受到带宽需求的限制,而不是一个固定的值。因此,您可能能够解码两个 720p 流,但只能解码一个 1080p 流。

在许多设备上,如果硬件无法支持您的请求,OMX 将切换到软件解码器,例如一种较旧的 Nexus 设备可以让您使用硬件编解码器解码两个流,然后开始分发软件编解码器实例。

getMaxSupportedInstances() 调用试图提供额外的信息,但据我所知,仍然需要对每台设备进行一定数量的试验和错误,以确定设备究竟可以做什么.

关于Android 媒体编解码器 : How many simultaneous (video) decoding threads are supported on multiple SurfaceViews?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36356193/

相关文章:

java - 什么是java中的客户端代码

android - 无法在 Intel x86 设备、Android 4.2.2 上使用 H264(视频/avc)编码器

android - 当元数据旋转不正确时如何获取视频旋转角度?

Android MediaCodec dequeueOutputBuffer 总是在三星设备 android 10 中返回 -1

android - 带复选框的游标 ListView

android - 将 OnClick 翻译成 OnTouch(或类似的东西)?

android - 为什么从 onMeasure 设置文本不会影响 TextView?

java - 需要从中获取 JSONObjects

android - 是否可以通过 C 级别使用 android API?或者我可以通过 C 代码使用编解码器吗?

android - 媒体编解码器 : MediaFormat setting KEY_I_FRAME_INTERVAL value is ignored