Android MediaPlayer - иногда не воспроизводится видео, даже если воспроизводится звук - PullRequest
20 голосов
/ 22 сентября 2011

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

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

Я сканировал Интернет и ТАК пытался найти решения, но ни одно из них не было адекватным (см. Ниже).

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

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

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

Android Media Player показывает аудио, но не видео

видео для Android, слышу звук, но нет видео

Некоторые подробности:

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

Обновление:

Я отлаживал это и просматривал 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 отправлено. Событие при необходимости будет отправляется один раз за трек.

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

Ответы [ 5 ]

18 голосов
/ 29 сентября 2011

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

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

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

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

3 голосов
/ 11 декабря 2012

Следуя советам SpeedPlay, я придумал следующий код. Если 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();
            }
         });
   }
1 голос
/ 11 января 2012

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

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

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

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

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

0 голосов
/ 23 октября 2012

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

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

0 голосов
/ 26 сентября 2011

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

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

Здесь вы найдете пользовательские диски для вашего устройства: XDA Developers

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

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

сафари =)

...