#android #android-mediacodec #openmax
#Android #android-mediacodec #openmax
Вопрос:
При использовании MediaCodec много раз сообщения об ошибках поступают с уровня OMX. Как можно использовать их для отладки не столь тривиальных проблем? Например, у меня есть приложение, которое иногда не может создать кодек для декодирования потока h264. Кажется, это происходит только на некоторых устройствах, таких как Samsung S4 (I9505), в то время как на S3, Nexus 4 (старый) этого не происходит. Одно и то же видео в большинстве случаев отлично декодируется на S4. Перед созданием кодека необходимо выполнить некоторые интенсивные вычисления, включая OpeGL. Строка, в которой он терпит неудачу, такова:
MediaCodec.createByCodecName(codecInfo[0].getName());
С codecInfo[0].getName()
наличием значения OMX.qcom.video.decoder.avc
и следующего вывода в logcat:
06-23 19:12:18.197: I/OMXClient(23749): Using client-side OMX mux.
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): In OMX vdec Constructor
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): vidc.dec.debug.ts value is 0
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): vidc.dec.debug.concealedmb value is 0
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): vidc.dec.debug.extradata value is 0
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): Successfully opened vdec ion devicefd = 35
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): Successfully created vdec ionlock
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): Vdec instances = 1, ion device fd = 35
06-23 19:12:18.197: E/OMX-VDEC-1080P(282): omx_vdec::component_init(): Start of New Playback : role = OMX.qcom.video.decoder.avc : DEVICE = /dev/msm_vidc_dec
06-23 19:12:18.197: D/STATUSBAR-NetworkController(1111): updateDataNetType()
06-23 19:12:18.197: D/STATUSBAR-NetworkController(1111): Nothing, mRoamingIconId = 0
06-23 19:12:18.227: E/OMX-VDEC-1080P(282): omx_vdec::component_init(): Open returned fd 36, errno 24
06-23 19:12:18.227: E/OMX-VDEC-1080P(282): component_init: current performance level = 0
06-23 19:12:18.227: E/OMX-VDEC-1080P(282): pipe creation failed.
06-23 19:12:18.227: E/OMX-VDEC-1080P(282): Component Init Failed
06-23 19:12:18.227: E/OMX-VDEC-1080P(282): Calling VDEC_IOCTL_STOP_NEXT_MSG
06-23 19:12:18.227: E/OMX-VDEC-1080P(282): In OMX Vdec Destructor(), Vdec instances = 1
06-23 19:12:18.227: E/OMX-VDEC-1080P(282): Calling close() on Video Driver
06-23 19:12:18.247: E/OMX-VDEC-1080P(282): Calling close() on vdec ion devicefd = 35
06-23 19:12:18.247: E/OMX-VDEC-1080P(282): Successfully destroyed vdec ionlock
06-23 19:12:18.247: E/OMX-VDEC-1080P(282): Exit OMX vdec Destructor
06-23 19:12:18.247: E/(282): Destroy C2D instance
06-23 19:12:18.247: E/(282): Destroy C2D instance
06-23 19:12:18.247: E/ACodec(23749): Unable to instantiate decoder 'OMX.qcom.video.decoder.avc'.
06-23 19:12:18.247: E/MediaCodec(23749): Codec reported an error. (omx error 0x80001003, internalError -2147483648)
Кроме того, в случае, если это ошибка, зависящая от устройства, что может сделать разработчик, чтобы помочь решить проблему?
Комментарии:
1. что вы подразумеваете под «иногда не удается создать кодек для декодирования потока h264»? иногда работает, иногда нет? Единственная причина, по которой я столкнулся с этим, не выпускает декодер после использования. Некоторые устройства позволяют иметь только один экземпляр codec, поэтому, если вы использовали codec и не выпустили его перед следующим использованием, он не сможет создать экземпляр
2. Да, я имею в виду, что в большинстве случаев это работает, но примерно в 5% случаев появляются указанные выше ошибки. Это происходит только на этом устройстве. И это произошло и для первого видео. Но спасибо за совет, я проверю, создается ли декодер по другим причинам, прежде чем фактически декодировать.
3. Чтобы легко проверить, является ли это двойным созданием, что предлагает errno 24 — EMFILE, из Venus, проверьте его в dmesg (журнал ядра). Источники компонентов Vdec вы можете найти в hardware / qcom /media / mm-video (или mm-video-msm8974, если вы его используете). Связанный код драйверов, который вы будете идентифицировать, отслеживая перечисления IOCTL.
4. Ошибка была вызвана интенсивным использованием: Создание объекта MediaMetadataRetriever, затем вызов prepare и extractMetadata(METADATA_KEY_DURATION) для каждого кадра. Таким образом, это было двойное создание экземпляра декодера из-за ошибки с моей стороны. Я оставляю его открытым на случай, если кто-то предоставит хорошие ресурсы / учебники для обработки такого рода ошибок.
5. проверьте это : github.com/google/ExoPlayer/issues/1286