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 отправляется. Событие, если необходимо, будет отправляется один раз на дорожку.
Мне кажется, что я прошел долгий путь, но не ближе к поиску ответа... все еще расследую.
Ответы
Ответ 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, так что вы слышите только звук, но не видите изображение!
Правильный путь: