Android media codec error



The H.264 avc video encoded by MediaCodec in Android cannot be played

BACKGROUND:

I have been working on implementing a Vine like video recorder for two days. First, I tried the MediaRecorder. But the video I need may be composed by small video clips. This class cannot be used to record a short-time video clip. Then I found the MediaCodec, FFmpeg and JavaCV. FFmpeg and JavaCV could solve this problem. But I have to compile my project with many library files. It will generate a very large APK file. So I prefer implementing it by MediaCodec, although this class only can be used after Android 4.1. 90% percent users will be satisfied.

RESULT:

I finally got the encoded file, but it cannot be played. I checked the information by FFprobe, the result is like:

Input #0, h264, from ‘test.mp4’: Duration: N/A, bitrate: N/A Stream #0:0: Video: h264 (Baseline), yuv420p, 640×480, 25 fps, 25 tbr, 1200k tbn, 50 tbc

I do not know much about the mechanism of H.264 coding.

CODE:

Modified from this link

Invoke this class by Camera’s startPreview:

Close it when release Camera:

2 Answers 2

You’re saving a raw H.264 stream. You should convert it to .mp4 format. The easiest way to do this is with the MediaMuxer class (API 18+).

You can find a simple example on bigflake and more complete examples in Grafika.

You will need to provide presentation time stamps for each frame. You can either generate them according to your desired frame rate (like the bigflake example) or acquire them from the source (like the camera-input examples in Grafika).

Edit: For pre-API-18 devices (Android 4.1/4.2), MediaCodec is much more difficult to work with. You can’t use Surface input or MediaMuxer, and the lack of platform tests led to some unfortunate incompatibilities. This answer has an overview.

In your specific case, I will note that your sample code is attempting to specify the input format, but that has no effect — the AVC codec defines what input formats it accepts, and your app must query for it. You will likely find that the colors in your encoded video are currently wrong, as the Camera and MediaCodec don’t have any color formats in common (see that answer for color-swap code).

Источник

Как исправить кодек, не поддерживаемый на Android?

Ошибка неподдерживаемого Android видео или аудиокодека может быть легко исправлена ​​путем преобразования формата видеофайла в MP4 или воспроизведения видео в проигрывателе VLC Media Player с открытым исходным кодом с широким форматом видео и поддержкой кодеков.

Как исправить ошибку кодека?

Чтобы решить эту проблему, настройте проигрыватель Windows Media на автоматическую загрузку кодеков. Для этого выполните следующие действия в проигрывателе Windows Media 11: В меню «Сервис» выберите «Параметры». Перейдите на вкладку «Проигрыватель», установите флажок «Загружать кодеки автоматически» и нажмите «ОК».

Как исправить неподдерживаемые файлы на Android?

Вы не можете открывать неподдерживаемые изображения на устройстве Android. Поэтому лучший способ — преобразовать тип файла изображения в формат, поддерживаемый маркой и моделью вашего мобильного телефона. В случае, если, несмотря на наличие поддерживаемого типа файла изображения, изображение не открывается в Android, попробуйте перезагрузить телефон или уменьшить размер изображения.

Как изменить неподдерживаемый формат видео?

Вот несколько критических моментов, которые вы можете попытаться устранить, чтобы не отвлекаться от просмотра видео.

  1. Установите правильный кодек для неподдерживаемого видеофайла. …
  2. Используйте другой медиаплеер. .
  3. Преобразуйте формат видеофайла. …
  4. Восстановите поврежденный видеофайл.

Что такое сбой кодека?

Поэтому, если ваш медиаплеер или устройство не поддерживает видеоформат или кодек, он не будет воспроизводить видеофайл. Помимо отсутствия поддерживаемого кодека, ошибка недопустимого формата файла также может появиться при повреждении видеофайла.

Как исправить кодек на моем Android?

Ошибка неподдерживаемого Android видео или аудиокодека может быть легко исправлена ​​путем преобразования формата видеофайла в MP4 или воспроизведения видео в проигрывателе VLC Media Player с открытым исходным кодом с широким форматом видео и поддержкой кодеков.

Как мне найти свой кодек?

Чтобы определить, какой кодек использовался с конкретным файлом, по возможности воспроизведите файл в проигрывателе. Во время воспроизведения файла щелкните файл в библиотеке правой кнопкой мыши и выберите «Свойства». На вкладке Файл просмотрите разделы Аудиокодек и Видеокодек.

Как исправить неподдерживаемые файлы?

Как открыть неподдерживаемые файлы

  1. Посетите веб-сайт преобразования, например Free File Convert или Convert Files (см. Ресурсы).
  2. Нажмите на сайте кнопку «Обзор». Появится всплывающее окно. .
  3. Щелкните «Формат вывода». Выберите формат, который будет поддерживаться, в зависимости от типа файла. .
  4. Щелкните по кнопке «Конвертировать».
Читайте также:  Windows system32 drivers acpi sys error code 0xc000000f

Почему файл не поддерживается?

В большинстве случаев причина, по которой вы получаете сообщение об ошибке при попытке воспроизвести видеофайл на устройстве Android, заключается в том, что кодек вашего медиафайла не поддерживается вашим медиаплеером. Другая возможная причина — неподдерживаемый аудиокодек.

Как загрузить неподдерживаемое приложение на Android?

Перезагрузите устройство Android, подключитесь к VPN, расположенной в соответствующей стране, а затем откройте приложение Google Play. Надеемся, теперь ваше устройство должно находиться в другой стране, что позволит вам загружать приложения, доступные в стране VPN.

Как изменить формат видеофайла?

Как конвертировать видео в любой формат

  1. Выберите видео для конвертации. После установки Any Video Converter первое, что вам нужно сделать, это указать ему, какое видео вы хотите конвертировать. …
  2. Выберите предустановки устройства. Загляните в раздел «Профиль», и вы увидите раскрывающееся меню. …
  3. Выберите форматы экспорта. …
  4. Применяйте эффекты. …
  5. Обработайте видео. …
  6. Найдите воспроизведенное преобразованное видео.

Как исправить неподдерживаемый формат видео на iPhone?

Решение 1. Перезагрузите iPhone, чтобы исправить ошибку неподдерживаемого формата видео. Сначала закройте все приложения, которые работают в фоновом режиме вашего устройства. Затем перезагрузите устройство после полного закрытия всех приложений. После того, как ваше устройство перезагрузится, теперь воспроизводите видео в обычном режиме и ждите, если они начнут воспроизводиться.

Как исправить видео, которое не воспроизводится?

  1. Шаг 1. Обновите Chrome. Иногда для видео и игр требуется последняя версия Chrome. …
  2. Шаг 2. Включите JavaScript. Некоторым медиа нужен JavaScript. …
  3. Шаг 3. Сбросьте подключение к Интернету. Ваша Интернет-сеть может вызывать проблемы с видео или игрой. …
  4. Шаг 4. Проверьте кеш и файлы cookie.

Как установить кодек?

  1. Введение.
  2. 1 Дважды щелкните видео или аудио файл.
  3. 2Щелкните кнопку «Веб-справка».
  4. 3 Щелкните ссылку WMPlugins.
  5. 4 Щелкните ссылку на сайт загрузки кодека.
  6. 5Щелкните Я принимаю.
  7. 6 Щелкните ссылку, чтобы загрузить кодек.
  8. 7 Когда загрузка будет завершена, нажмите кнопку «Выполнить».

Что делает кодек?

Кодек — это устройство или часть программного обеспечения, способная кодировать или декодировать цифровой поток или сигнал для передачи по сети передачи данных. Кодек может быть для аудио- или видеоконтента.

Как я могу получить бесплатный кодек HEVC?

Однако вы также можете получить бесплатный пакет «Расширения для видео HEVC от производителя устройства» в магазине. Это то же самое, что и пакет за 0.99 доллара, но он полностью бесплатный. Щелкните ссылку и нажмите «Получить», чтобы установить их. Выполнено!

Источник

Caused by com.google.android.exoplayer2.video.MediaCodecVideoDecoderException Decoder failed: OMX.MTK.VIDEO.DECODER.AVC #10285

Comments

gb103 commented May 21, 2022 •

ExoPlayer Version

Devices that reproduce the issue

  1. OPPO Reno2 Z
  2. Xiaomi Mi A3
  3. Asus ZenFone Max Pro M2 (ZB631KL) (WW) / Max Pro M2 (ZB630KL) (IN)
  4. Infinix SMART 4 Plus

Devices that do not reproduce the issue

Reproducible in the demo app?

Reproduction steps

  1. Play a video, either start in the video or somewhere in the middle of the video Decoder failed exception occurs. middle case mostly appears when video goes into rebuffer state.
    Note : It’s not an always issue, but on whatever devices it is produced, it produces frequently.

Expected result

There should not be any decoder fail issue, playback should run smoothly

Actual result

Decoder Failed exception with below exceptions. (Different exceptions for different devices)
Crash Logs # 1

Device : Infinix SMART 4 Plus
Caused by com.google.android.exoplayer2.video.MediaCodecVideoDecoderException: Decoder failed: OMX.MTK.VIDEO.DECODER.AVC
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.createDecoderException(MediaCodecVideoRenderer.java:1410)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:844)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:978)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:482)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:264)
at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by java.lang.IllegalStateException
at android.media.MediaCodec.native_dequeueInputBuffer(MediaCodec.java)
at android.media.MediaCodec.dequeueInputBuffer(MediaCodec.java:2726)
at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter.dequeueInputBufferIndex(SynchronousMediaCodecAdapter.java:98)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:1213)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:825)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:978)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:482)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:264)
at android.os.HandlerThread.run(HandlerThread.java:67)

Crash Logs # 2

Device : realme RMX3231
Caused by com.google.android.exoplayer2.mediacodec.MediaCodecDecoderException: Decoder failed: c2.android.aac.decoder
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.createDecoderException(MediaCodecRenderer.java:963)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:844)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:978)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:482)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:255)
at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by java.lang.IllegalStateException
at android.media.MediaCodec.native_dequeueOutputBuffer(MediaCodec.java)
at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:3452)
at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter.dequeueOutputBufferIndex(SynchronousMediaCodecAdapter.java:105)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.drainOutputBuffer(MediaCodecRenderer.java:1838)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:823)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:978)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:482)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:255)
at android.os.HandlerThread.run(HandlerThread.java:67)

Crash Logs # 3

Device : OPPO Reno7 5G

Caused by com.google.android.exoplayer2.video.MediaCodecVideoDecoderException: Decoder failed: OMX.MTK.VIDEO.DECODER.AVC.secure
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.createDecoderException(MediaCodecVideoRenderer.java:1410)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:844)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:978)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:482)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:262)
at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by android.media.MediaCodec$CodecException: Error 0xffffffe0
at android.media.MediaCodec.native_dequeueInputBuffer(MediaCodec.java)
at android.media.MediaCodec.dequeueInputBuffer(MediaCodec.java:2855)
at com.google.android.exoplayer2.mediacodec.SynchronousMediaCodecAdapter.dequeueInputBufferIndex(SynchronousMediaCodecAdapter.java:98)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:1213)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:825)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:978)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:482)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:262)
at android.os.HandlerThread.run(HandlerThread.java:67)

Media

Will send the media file on the email.

Читайте также:  Vac authentication error fix

Bug Report

  • You will email the zip file produced by adb bugreport to dev.exoplayer@gmail.com after filing this issue.

The text was updated successfully, but these errors were encountered:

Источник

WebRTC на Android: как включить аппаратное кодирование на множестве устройств

Для видеозвонков в Badoo мы используем стандарт WebRTC и кодек H.264. Если верить документации, этот кодек должен без проблем работать на любых устройствах Android начиная с Android 5.0. Но на практике всё оказалось не совсем так. В этой статье я расскажу про особенности реализации аппаратного кодирования для кодека H.264 в WebRTC и о том, как заставить его работать на большем количестве устройств.

Почему именно H.264?

При соединении по WebRTC все устройства, участвующие в сеансе, передают различные параметры связи, в том числе видео- и аудиокодеки. Если устройства поддерживают несколько кодеков (например, VP8 и H.264), приоритетные для платформы кодеки указываются первыми. Эти данные используются на этапе согласования в WebRTC, после которого остаются только кодеки, поддерживаемые всеми устройствами. Пример таких данных с расшифровкой можно увидеть в этом документе.

В случае с видеозвонками при отсутствии на одном из устройств поддержки кодека H.264 оба устройства могут перейти, например, на кодек VP8, который не зависит от аппаратной реализации на устройстве. Но наше приложение доступно на самых разных гаджетах, в том числе на смартфонах предыдущих поколений. Поэтому для видеосвязи мы хотели по возможности использовать аппаратное кодирование: оно снижает нагрузку на процессор и не так сильно ест батарею, что критично для устаревших гаджетов. Поддержка аппаратного кодирования H.264 реализована на большом количестве устройств, в отличие от того же VP8.

Поддержка H.264 на Android

Если верить описанию поддержки форматов мультимедиа, декодирование H.264 Baseline Profile должно работать на всех Android-устройствах, а кодирование — начиная с Android 3.0. В Badoo мы поддерживаем устройства начиная с Android 5.0, так что у нас не должно было возникнуть проблем. Но всё оказалось не так просто: даже в гаджетах с пятой версией мы обнаружили большое количество особенностей.

С чем это может быть связано?

Как известно, при разработке нового устройства на Android любому производителю необходимо пройти набор тестов Compatibility Test Suite. Он запускается на подключённом к устройству ПК, а его результаты необходимо отправить в Google для подтверждения того, что устройство соответствует требованиям ОС Android указанной версии. Только после этого гаджет можно выпустить на рынок.

Нас в этом наборе тестов интересуют мультимедиа-тесты, а конкретнее — тесты на кодирование и декодирование видео. Я решил остановиться на тестах EncodeDecodeTest, MediaCodecTest, DecoderTest и EncoderTest, так как они присутствуют на всех версиях Android начиная с 4.3. График количества строк кода в этих тестах выглядит так:

До версии 4.3 большинства из этих тестов просто не существовало, и значительный их прирост пришёлся на версии 5 и 7. Поэтому можно говорить о том, что до версии Android 4.3 Google никак не проверяла соответствие устройств своей спецификации по кодированию и декодированию видео, а в версии 5.0 значительно улучшила эту проверку.

Казалось бы, это указывает на то, что начиная с версии 5.0 с кодированием всё должно быть в порядке. Но, учитывая предыдущий мой опыт работы с декодированием потокового видео на Android, я был уверен, что это не так. Достаточно было посмотреть на количество топиков про кодирование в Google-группе discuss-webrtc.

Искать подводные камни нам помогали исходные файлы WebRTC, которые находятся в свободном доступе. Рассмотрим их подробнее.

Поддержка H.264 в WebRTC

Тут есть метод с говорящим названием isHardwareSupportedInCurrentSdkH264:

Как мы видим, поддержка аппаратного кодирования на Android реализована только для чипсетов Qualcomm и Exynos. Почему же в стандартной реализации WebRTC нет поддержки других чипсетов? Вероятнее всего, это связано с особенностями реализации аппаратных кодеков производителей. И выявить эти особенности часто можно только на продакшене, поскольку найти те или иные устройства не всегда представляется возможным.

Все описания кодеков на устройстве хранятся в файле media_codecs.xml. Вот, например, этот файл для Pixel XL и для HUAWEI P8 lite. При получении списка кодеков с помощью метода getCodecInfos() объекта MediaCodecList этот файл парсится — и возвращаются кодеки, хранящиеся в нём. Эта операция и правильность заполнения этого файла производителем покрываются в CTS тестом MediaCodecListTest, который также увеличился со 160 строк кода в Android 4.3 до 740 строк в Android 10.

В Badoo мы поменяли код метода isHardwareSupportedInCurrentSdkH264, отказавшись от «белого» списка кодеков и заменив его «чёрным» списком префиксов программных кодеков, которые перечислены в WebRTC:

Читайте также:  Nested exception is org hibernate transactionexception unable to commit against jdbc connection

Но нельзя просто так взять и реализовать поддержку всех кодеков, не обращая внимания на особенности производителей. Из названий топиков, посвящённых аппаратному кодированию на Android в группе discuss-webrtc, можно понять, что в этом случае у нас точно возникнут ошибки. В основном они появляются на этапе конфигурации кодека.

Параметры конфигурации кодека

Инициализация кодека для кодирования выглядит так:

В некоторых из этих параметров легко допустить ошибку, что вызовет исключение при конфигурации кодека и нарушит работу приложения. Также при работе с кодеком может понадобиться регулировать его битрейт в зависимости от различных факторов, так как сам кодек делает это неправильно. За это в WebRTC отвечает класс BaseBitrateAdjuster, у которого есть два наследника:

  • DynamicBitrateAdjuster — регулирует битрейт в зависимости от объёма данных,
  • FramerateBitrateAdjuster — регулирует битрейт в зависимости от частоты кадров.

Соответственно, для каждого кодека необходимо выбрать свой механизм регулировки битрейта. Рассмотрим подробнее особенности установки параметров инициализации для аппаратных кодеков.

Разрешение потока

После получения для кодека объекта MediaCodecInfo можно изучить кодек подробнее, получив его возможности в классе CodecCapabilities. Из них можно узнать, поддерживает ли кодек выбранные разрешение и частоту кадров. Если он поддерживает эти параметры, их можно устанавливать безопасно.

Однако иногда это правило не работает. Мы столкнулись с тем, что кодеки с префиксом “OMX.MARVELL.” кодировали неправильно, показывая зелёные полосы по краям экрана, если разрешение потока отличалось от 4:3. При этом сам кодек утверждал, что выбранные разрешение и частота кадров поддерживаются.

Режим битрейта

Стандартный режим для всех видеокодеков — постоянный битрейт. Однако однажды нам пришлось использовать переменный битрейт:

Произошло это на устройстве Lenovo A1000 с чипсетом компании Spreadtrum (теперь Unisoc), начинающимся с префикса “OMX.sprd.”. Поиск в Интернете привёл нас к посту шестилетней давности о Firefox OS, описывающему эту проблему и способ её решения.

Цветовой формат

При использовании кодека в режиме байт-буферов необходимо выбрать правильный формат. Обычно это делается с помощью функции следующего вида:

Грубо говоря, всегда выбирается первый из поддерживаемых цветовых форматов.

Однако в случае с кодеками HUAWEI, начинающимися с префиксов «OMX.IMG.TOPAZ.», «OMX.hisi.» и «OMX.k3.», это не работало, и после долгих поисков мы нашли решение: вне зависимости от того, какой формат возвращают эти кодеки, необходимо использовать формат COLOR_FormatYUV420SemiPlanar. Разобраться в этом нам помог тред на одном китайском форуме.

Регулировка битрейта

Стандартный код WebRTC содержит следующее:

Как видно из этого кода, для всех чипсетов, кроме Exynos, регулировка битрейта выключена. Но это относится только к Qualcomm, так как в стандартном коде поддерживаются только Exynos и Qualcomm. Поэкспериментировав с различными значениями этой настройки, а также поискав в Интернете, мы выяснили, что для кодеков с префиксами «OMX.MTK.» её тоже нужно включить. Также необходимо сделать это для кодеков HUAWEI, начинающихся с префикса «OMX.IMG.TOPAZ.», «OMX.hisi.» или «OMX.k3.». Это связано с тем, что эти кодеки не используют временные метки кадров для регулировки битрейта, считая, что все кадры приходят с одинаковой частотой, установленной при конфигурации кодека.

В завершение приведу список кодеков, которые мы получили для устройств на Android 5.0 и 5.1. Они были нам интересны в первую очередь потому, что на более новых версиях Android ситуация улучшается и нестандартных кодеков становится всё меньше.

Это видно на графике ниже. Шкала логарифмическая, чтобы лучше показать редкие случаи.


Как мы видим, у большинства устройств были чипсеты Spreadtrum, MediaTek, HUAWEI и MARVELL — поэтому наши изменения помогли включить аппаратное кодирование на этих гаджетах.

Результат

Хотя мы и предполагали, что на некоторых устройствах при работе с H.264 будут возникать проблемы, Android опять смог нас удивить. Как мы видим из статистики пользователей Badoo, на руках у пользователей ещё достаточно много устройств 2014–2016 года выпуска, которые они не хотят или не могут обновлять. И хотя ситуация с выходом обновлений Android для новых устройств уже гораздо лучше, чем несколько лет назад, доля гаджетов предыдущего поколения сокращается довольно медленно и поддерживать их придётся ещё достаточно долго.

Сейчас WebRTC активно развивается Google из-за его использования в проекте Stadia (вот видео с подробностями на эту тему), поэтому он будет становиться всё лучше и лучше и, скорее всего, станет стандартом для реализации видеосвязи. Надеюсь, что эта статья поможет вам понять особенности работы с H.264 в WebRTC и использовать это в своих проектах.

Источник

Оцените статью
toolgir.ru
Adblock
detector