2016-04-01 3 views
1

От Grafika проект, файл DoubleDecodeActivity.java. Я попробовал 3 одновременных видео (h264) декодера с использованием MediaCodec API на 3 SurfaceViews. При добавлении 4-го декодера в 4-й SurfaceView к Nexus 7 с Android 5.1 CRASHES, так, сколько одновременных декодеров будет возможно или поддерживается.Android MediaCodec: Сколько одновременных (видео) потоков декодирования поддерживается на нескольких SurfaceViews?

PS. После этого сбоя MediaCodec больше не работает. Необходимо перезапустить устройство для использования MediaCodec.

Ниже приведен журнал аварий. Сбой при decoder.start() функции для потока 4-го декодера.

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 

ответ

1

Это несколько плохо определено.

В API 23 был добавлен метод MediaCodecInfo getMaxSupportedInstances(), который смело утверждает: «Это подсказка для верхней границы».

Неполадка при определении этого значения заключается в том, что количество экземпляров оборудования может быть ограничено требованиями к пропускной способности, а не фиксированным значением. Таким образом, вы можете декодировать два потока 720p, но только один поток 1080p.

На многих устройствах, если аппаратное обеспечение не может поддерживать ваш запрос, OMX переключится на программный декодер, например. один из старых устройств Nexus позволит вам декодировать два потока с аппаратным кодеком, а затем начать раздавать экземпляры программного кодека.

Звонок getMaxSupportedInstances() был попыткой предоставить дополнительную информацию, но насколько я могу судить, для определения того, что именно может сделать устройство, по-прежнему требуется некоторое количество проб и ошибок для каждого устройства.