Подтвердить что ты не робот

Android MediaPlayer - иногда не воспроизводится видео, даже если аудиозапись

Я разрабатываю приложение для Android, и я использую Android SDK MediaPlayer для воспроизведения некоторых видео в своем приложении. Когда я воспроизвожу видео в своем приложении, примерно один из пяти раз, звук воспроизводится без видео. Это не простая ошибка кодирования, потому что большую часть времени видео воспроизводится отлично.

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

Я просмотрел веб-страницы и попытался найти решения, но ни один из них не был адекватным (см. ниже).

Кто-нибудь сталкивался с этим типом проблемы раньше? Если да, то чем вы занимались?

Похожие вопросы:

Видео MediaPlayer не воспроизводится

мультимедийный плеер Android показывает звук, но не видео

андроид видео, услышать звук, но нет видео

Некоторые детали:

  • Я столкнулся с этой ошибкой на двух телефонах. На Samsung Charge видео воспроизводится в 80% случаев, а в 20% случаев - нет, но нет видео. На T-Mobile Comet это намного хуже; видео воспроизводится только в 10% случаев.
  • Это не проблема с файлом, я пробовал различные видеофайлы и кодеки и получал те же самые проблемы.
  • Это не проблема с носителем данных. Я пытался воспроизвести видео, когда он был сохранен на внутреннем хранилище и SD-карте, и не имеет никакого значения. Я даже пробовал читать некоторые файлы перед тем, как играть, надеясь, что система будет кэшировать его, но это тоже не помогает.

Update:

Я отлаживал это и просматривал logcat. Я обнаружил, что когда видео работает, в logcat появляется следующее:

09-28 00:09:03.651: VERBOSE/PVPlayer(10875): setVideoSurface(0x65638)

Но когда видео не воспроизводится, похоже, что есть нулевая запись:

09-28 00:03:35.284: VERBOSE/PVPlayer(10875): setVideoSurface(0x0)

Обновление 2:

Когда видео не воспроизводится, функция MediaPlayer.OnInfoListener с параметрами what==MEDIA_ERROR_UNKNOWN(0x1) и extra==35. Я просмотрел базу данных Android, чтобы определить, что означает неизвестная ошибка 35. Я столкнулся с файлом pv_player_interface.h, который указывает, что код ошибки 35 соответствует тому, что называется PVMFInfoTrackDisable. Я искал этот термин, который привел меня в файл под названием pvmf_return_codes.pdf. Этот файл дал мне следующее непонятное объяснение:

4,34. PVMFInfoTrackDisable

Уведомление о том, что отключить. Этот вариант предназначен для каждого трека. Для несжатого аудио/видео форматов во время выбора доступных дорожек в содержании, если декодер не поддерживает дорожку, Событие PVMFInfoTrackDisable отправляется. Событие, если необходимо, будет отправляется один раз на дорожку.

Мне кажется, что я прошел долгий путь, но не ближе к поиску ответа... все еще расследую.

4b9b3361

Ответ 1

Я решил проблему, хотя и совершенно хакерским способом. На самом деле есть две проблемы:

  • Сообщение Evil Info 35: Я обнаружил, что иногда MediaPlayer.OnInfoListener будет вызван с дополнительным == 35. Когда это произойдет, вы будете ввернуты, и видео не будет воспроизводиться должным образом. Я понятия не имею, что вызывает его. Единственное исправление, которое я нашел, это попытаться перезапустить видео и снова пройти весь процесс prepareAsync. Воспроизведение видео обычно работает во второй раз.

  • Размер видео не установлен: Даже после того, как выйдет MediaPlayer.OnPreparedListener(или что-то вроде prepare() возвращается) размер видео не может быть установлен. Размер видео обычно устанавливается через пару миллисекунд после подготовки, но в течение нескольких мгновений он находится в туманном состоянии. Если вы выберете MediaPlayer.start() до того, как размер видео установлен, воспроизведение иногда (но не всегда) прерывается. Для этого есть два возможных решения: (1) опрос MediaPlayer.getVideoHeight() или getVideoWidth() до тех пор, пока они не равны нулю или (2) не ожидают вызова OnVideoSizeChangedListener. Только после одного из этих двух событий вы должны вызвать start().

С этими двумя исправлениями воспроизведение видео намного более последовательное. Очень вероятно, что эти проблемы связаны с моими телефонами (Samsung Charge и T-Mobile Comet), поэтому я не удивлюсь, если на других телефонах есть разные, но похожие проблемы.

Ответ 2

Следуя рекомендациям на плане скорости, я придумал следующий код. Если MediaPlayer.getVideoHeight() возвращает 0 в onPrepared, я задерживаю 1 секунду и повторю попытку. Теперь, если он не играет в первый раз, он обычно будет играть 1 секунду позже. Я видел, что это требует нескольких попыток.

   private void videoPlayer(String path){
      if (mMediaController == null)
      {
         mMediaController = new MediaController(this);
         mVideoView.setMediaController(mMediaController);
      }
      if (!mMediaController.isShowing())
         mMediaController.show();

      getWindow().setFormat(PixelFormat.TRANSLUCENT);
      mVideoView.setVideoPath(path);
      mVideoView.requestFocus();
      mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
               public void onPrepared(final MediaPlayer mp) {
               mVideoView.seekTo(mImageSeek);
               if (mp.getVideoHeight() == 0) {
                  final Handler handler = new Handler();
                  handler.postDelayed(new Runnable() {
                        @Override
                           public void run() {
                           mVideoView.stopPlayback();
                           mMediaController = null;
                           videoPlayer(mImageFilepath);
                        }
                     }, 1000);
               } else 
                  mVideoView.start();
            }
         });
   }

Ответ 3

Я изучаю эту ошибку 2 недели, и я понял более или менее настоящую проблему. Конечно, я говорю о The Evil Info 35 Message. Если вы столкнулись с этой странной странной ошибкой, теперь вы можете быть счастливы и застрелили таких поставщиков, как samsung: D...

Проблема возникает из-за того, что пользователь не видит видимость поверхности (активность в режиме табуна или паузы-пробуждения, иногда не в фокусе, а не спереди иногда (возможно)).

Это приводит к тому, что при некотором reset, что это видео работает нормально, оно вызывает фокусировку или, возможно, другое действие/объект не перекрывает его.

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

Увидят следующую ошибку, удачи.: D

Ответ 4

У меня была эта проблема тоже на моем Desire HD примерно 1 или 2 раза. Я пробовал много вещей, но ошибка всегда была там. После того, как я выбрал, чтобы установить пользовательский ром на моем устройстве. Впоследствии он работал отлично, и у меня никогда не было этой проблемы.

Я знаю, что это не тот ответ, который вы хотели бы услышать, но я не нашел другого душа.

Здесь вы найдете пользовательские ромы для своего устройства: Разработчики XDA

Я надеюсь, что смогу помочь вам.

С наилучшими пожеланиями и счастливым просмотром фильмов

safari =)

Ответ 5

Основной вопрос: перед вызовом surfaceCreated вы начинаете воспроизведение видео, когда держатель не готов к MediaPlayer, так что вы слышите только звук, но не видите изображение!

Правильный путь: