Android MediaPlayer – иногда не воспроизводится видео, хотя звуковые композиции

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

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

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

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

Похожие темы:

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

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

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

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

  • Я столкнулся с этой ошибкой на двух телефонах. На Samsung Charge видео воспроизводится 80% времени и 20% времени, когда есть звук, но нет видео. На T-Mobile Comet это намного хуже; Видео воспроизводится только в 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. Событие, если необходимо, будет отправлено один раз на дорожку.

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

Solutions Collecting From Web of "Android MediaPlayer – иногда не воспроизводится видео, хотя звуковые композиции"

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

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

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

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

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

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

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

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

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

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

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

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

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

Надеюсь, я смогу помочь тебе.

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

Сафари =)

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

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