【问题标题】:Android MediaCodec: How many simultaneous (video) decoding threads are supported on multiple SurfaceViews?Android MediaCodec:多个 SurfaceView 支持多少个同时(视频)解码线程?
【发布时间】:2016-04-01 12:19:49
【问题描述】:

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

PS。在这次崩溃之后,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

【问题讨论】:

    标签: android android-mediacodec


    【解决方案1】:

    这有点不好定义。

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

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

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

    getMaxSupportedInstances() 调用试图提供更多信息,但据我所知,仍然需要对每个设备进行一定程度的反复试验才能确定设备的具体功能。

    【讨论】:

    • 我注意到,在我的设备上,我一次只能解码一个 1080p 流,除非输入视频是用 FFmpeg 编码的。这让我想知道它是否与输入视频的编码方式有关。所有设备都会这样吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 2010-10-20
    • 2015-11-12
    • 1970-01-01
    • 2014-08-27
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多