Android 4.2 с 4 медиаплеерами = Не удается воспроизвести это видео

Всякий раз, когда я пытаюсь загрузить как минимум 4 медиаплеера, один из них искажает видео, которое он пытается загрузить, и вызывает сообщение ОС Android «Не удается воспроизвести это видео».

Дополнительная информация:

На 3-х медиаплеерах все работает нормально.

На других версиях Android, отличных от 4.2, работает тот же код с теми же 4 видео.

Видео 4 можно воспроизводить независимо на устройстве. Проблем с форматом нет.

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

Я пробовал это как с VideoViews, так и с независимыми MediaPlayers, отображаемыми на SurfaceViews.

Я воспроизвел ошибку на других устройствах под управлением Android 4.2. На андроиде 4.1.2 и других версиях андроида 4 не помню, код нормально работал.


person Stefan Alexandru    schedule 05.04.2013    source источник
comment
Удалось ли вам воспроизвести 4 видео на одном экране, потому что, когда я пытаюсь воспроизвести 4 видео на одном экране в 4 видеопросмотрах, появляется сообщение о том, что видео не может быть воспроизведено, пожалуйста, помогите мне.   -  person bindal    schedule 09.11.2013


Ответы (1)


В Android идея заключается в том, что все, что связано с медиакодеками, скрыто от разработчика, который должен использовать согласованный и уникальный API: MediaPlayer.

Когда вы воспроизводите мультимедиа, будь то поток или что-то, расположенное на внешнем устройстве, низкоуровневые кодеки/парсеры запускаются каждый раз, когда приложению потребуется их помощь.

Однако бывает, что по определенным причинам, связанным с аппаратным декодированием, некоторые кодеки не могут быть созданы более одного раза. На самом деле каждое приложение должно освобождать ресурсы (например, экземпляры кодеков), когда они им больше не нужны, вызывая MediaPlayer.release() в допустимом состоянии.

На самом деле то, что я говорю, проиллюстрировано в документации. из release на веб-сайте разработчиков Android:

Освобождает ресурсы, связанные с этим объектом MediaPlayer. Считается хорошей практикой вызывать этот метод после завершения работы с MediaPlayer. В частности, всякий раз, когда действие приложения приостанавливается (вызывается его метод onPause()) или останавливается (вызывается его метод onStop()), этот метод следует вызывать для освобождения объекта MediaPlayer, если приложение не имеет специального нужно держать объект рядом. В дополнение к удержанию ненужных ресурсов (таких как память и экземпляры кодеков), отказ от немедленного вызова этого метода, если объект MediaPlayer больше не нужен, может также привести к постоянному расходу заряда батареи для мобильных устройств и сбою воспроизведения для других приложений, если нет на устройстве поддерживается несколько экземпляров одного и того же кодека. Даже если поддерживается несколько экземпляров одного и того же кодека, можно ожидать некоторого снижения производительности при одновременном использовании нескольких ненужных экземпляров.

Итак, либо вы не вызываете release, когда закончили воспроизведение, либо другое приложение содержит ссылку на ресурсы такого типа.

ИЗМЕНИТЬ:

Если вам нужно рендерить несколько видео на одном и том же Activity, у вас есть два варианта. Как я сказал в своем ответе, то, что вы изначально хотели, невозможно из-за проблем низкого уровня, кстати, это не относится и к iOS.

Однако вы можете попробовать сделать следующее:

  • Если медиафайлы, которые вы воспроизводите, не транслируются в режиме реального времени, вы можете объединить 4 видео в одно, используя один из широко доступных бесплатных видеоредакторов. Затем отобразите видео в полноэкранном режиме в своей деятельности, это будет выглядеть так, как будто у вас есть 4 Views.

  • Если это контент в реальном времени или незаписанный, оставьте первое видео как есть. Я предполагаю, что каждое видео закодировано с использованием одного и того же кодека/контейнера. Возможно, вы пытаетесь перекодировать 3 других видео, чтобы они использовали другой кодек и другой формат. Убедитесь, что вы перекодируете кодек/контейнер, который поддерживается Android. . Это может заставить Android одновременно использовать разные декодеры. Я думаю, что это излишество по сравнению с результатом, который вы ожидаете.

  • Наконец, вы можете использовать другой бэкенд для декодирования, например MediaPlayer + FFMPEG или просто FFMPEG. Но опять же, даже если это сработает, я думаю, это будет огромный перебор.

Подводя итог, вы должны идти на компромиссы, чтобы это работало.

person Halim Qarroum    schedule 05.04.2013
comment
Эй, спасибо за повтор. К сожалению, это мне не помогает, потому что мне действительно нужны все 4 экземпляра MediaPlayer одновременно. Я уверен, что никакое другое приложение не использует ресурсы, потому что я перезагружаю устройство. Странно, что на других версиях Android работает. - person Stefan Alexandru; 06.04.2013
comment
Когда вы говорите о других версиях Android, я предполагаю, что вы тестировали это и на других телефонах. Я не понимаю, почему вы должны одновременно хранить ссылку на 4 MediaPlayers. Даже если вы запускаете совершенно разные действия, службы или приложения, вы должны создать экземпляр MediaPlayer on-demand и отпустить его, как только воспроизведение закончится или по любой другой причине, которая может привести к остановке воспроизведения. А затем, снова, переустановите его, когда требуется воспроизведение. - person Halim Qarroum; 06.04.2013
comment
Мне нужно показать 4 перспективы одного и того же объекта параллельно на одном экране. - person Stefan Alexandru; 06.04.2013
comment
То есть 4 видео на одном и том же Activity ? - person Halim Qarroum; 06.04.2013
comment
да, 4 видео должны быть запущены одновременно в одном и том же действии - person Stefan Alexandru; 06.04.2013
comment
Напишите пожалуйста как вы решили эту проблему? У меня такая же проблема - person user1787773; 26.06.2013
comment
Если вы используете только Android MediaPlayer, вы не сможете, поскольку базовые кодеки низкого уровня не смогут быть созданы в случае, если вы уже используете параллельные экземпляры. - person Halim Qarroum; 26.06.2013