Ошибка VideoView / MediaPlayer (1, -18) - PullRequest
       22

Ошибка VideoView / MediaPlayer (1, -18)

2 голосов
/ 28 сентября 2011

У меня есть приложение, созданное для уровня API 2.2. Это приложение содержит видео, которое начинает воспроизводиться сразу после запуска. Видео воспроизводится внутри VideoView, и фактически видеофайл хранится в моем внутреннем хранилище (каталог файлов для пакета моих приложений).

Большую часть времени он запускается просто отлично. Но иногда я получаю всплывающее сообщение об ошибке «К сожалению, это видео не может быть воспроизведено». и имеет кнопку ОК. Как только я нажимаю кнопку ОК, видео начинает воспроизводиться правильно. Мне нужно выяснить, что является причиной этой ошибки, или, по крайней мере, как я могу поймать любую ошибку, и сделать это еще раз, так как она всегда работает идеально после того, как я нажму ОК. Внутри журналов, когда отображается это окно с ошибкой, я вижу следующие сообщения:

 ERROR/PVOMXAudDecNode(21215): Ln 2232 OMX_EventError nData1 -2147479547 nData2 0
 ERROR/PlayerDriver(21215): Command PLAYER_PREPARE completed with an error or info -18
 ERROR/MediaPlayer(9282): message received msg=100, ext1=1, ext2=-18
 ERROR/MediaPlayer(9282): error (1, -18)
 ERROR/MediaPlayer(9282): callback application
 ERROR/MediaPlayer(9282): back from callback
 ERROR/MediaPlayer(9282): Error (1,-18)
 DEBUG/VideoView(9282): Error: 1,-18

Где найти ссылку на то, что именно указывает код ошибки -18? И есть ли у кого-нибудь предложения, которые я мог бы попытаться предотвратить, в первую очередь. Я только наблюдал эту ошибку на Sprint Epic 4g.

Edit: насколько я могу судить, мне не бросают никаких исключений. Я предполагаю, что происходит то, что просмотр видео знает, как отследить любое исключение, вызывающее всплывающее окно. Внутри моего журнала нет трассировки стека исключений, только эта ссылка на ошибку -18.

Что касается того, как я звоню, готовьтесь. Я использую это:

    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer arg0) {
             mVideoView.start();
        }
    });

и это:

mVideoView.setVideoPath(file.getAbsolutePath());

он вызывает prepare как часть setVideoPath (я предполагаю, что это так или иначе, но этот метод недокументирован). что вызывает вызов onPrepared в моем слушателе.

Редактировать 2: сейчас я только что добавил onErrorListener следующим образом:

РЕДАКТИРОВАТЬ ВАЖНО! этот код вызовет цикл ошибок в ICS. Для устройств ICS я снял вызов setPath и вместо этого возвратил false. Он пробует снова один раз и успешно.

    mVideoView.setOnErrorListener(new OnErrorListener(){

        @Override
        public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
            Log.i(myTag, "MP ERROR: "+ arg1 + " - " + arg2);
            mVideoView.setVideoPath(file.getAbsolutePath());
            return true;
        }

    });

это ловит ошибку, и я вижу в моих журналах, что arg2 = -18, когда эта ошибка происходит. Я просто повторяю и возвращаю истину, чтобы не вызывать диалог. До сих пор я никогда не видел, чтобы два раза подряд происходил сбой, поэтому это всегда правильно запускает видео и не делает бесконечный цикл.

Мне все еще очень интересно, может ли кто-нибудь сказать мне, что именно код ошибки -18 указывает.

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Как вы ловите потенциальные исключения, выданные prepare()? Вы ловите IOException специально и затем повторяете вызов prepare()?

Попробуйте вместо этого использовать prepareAsync(), который не блокирует и вызывает слушателя, когда игрок готов. Также не бросает IOException.

0 голосов
/ 11 марта 2013

Если вы используете его на Froyo или Gingerbread, проблема может заключаться в том, что ваше устройство не поддерживает воспроизведение файла.Более низкие версии не поддерживают видео, закодированные в форматах, отличных от базового формата.Вы можете использовать некоторые инструменты, такие как информация о видео на ПК, и проверить, отформатированы ли файлы в базовом формате.

...