В 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