Android 4.0.4 MediaPlayer готовят выпуск с использованием URL-адресов RTSP

Я испытываю странную проблему с приложением для потоковой передачи видео, над которым я работаю. Фактическая потоковая передача видео / аудио работает на всех моих тестовых устройствах. Однако, по-видимому, любое устройство 4.0+ при использовании URL-адреса RTSP готово () возвращается мгновенно (это вызывает проблему, обеспечивающую правильную обратную связь с пользователями при загрузке видео и вмешивающихся в несколько других систем, которые у меня есть).

Ниже представлен блок кода, в котором я инициализирую и настраиваю свой MediaPlayer, но помню несколько вещей:

  • Мой метод initPlayer вызывается из AsyncTask.
  • Видео в конечном итоге воспроизводится правильно, но подготовка к возврату мгновенно создает недостаток обратной связи для пользователя во время загрузки видео.
  • Никаких ошибок не происходит во время всего процесса
  • Start () вызывается в MediaPlayer через метод onPrepared в моем OnPreparedListener, который, очевидно, становится проблемой, когда prepare () возвращается, прежде чем он будет готов к воспроизведению.
  • Потоки HTTP работают нормально, и на каждом тестовом устройстве ниже 4.0 проблема не возникает.

Я пытался исправить это за нелепое время и не смог найти кого-либо еще, кто столкнулся с этой проблемой. Любые идеи очень приветствуются.

public void initPlayer() { //We first need to make sure the MediaPlayer isn't null if(mMediaPlayer==null){ mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mediaPlayerPreparedListener); mMediaPlayer.setOnCompletionListener(mediaPlayerCompletionListener); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } //If a video/stream has been chosen while another is already playing else if(mMediaPlayer.isPlaying()){ mMediaPlayer.reset(); } //Video is not in full screen mode second = false; try { mMediaPlayer.setDataSource(videoString); holder = mPreview.getHolder(); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //onPreparedListener private OnPreparedListener mediaPlayerPreparedListener = new OnPreparedListener(){ public void onPrepared(MediaPlayer mp) { mp.start(); vidPb.setVisibility(View.INVISIBLE); } }; 

Используйте mp.prepareAsync() как это лучше для потокового мультимедиа. Использование блоков prepare() до тех пор, пока MediaPlayer не будет готов к воспроизведению или не произойдет исключение IllegalStateException. Кроме того, в android 4 (ICS) блокирование любого потока пользовательского интерфейса еще более строгое и может привести к появлению диалогового окна ANR (Activity not responseing).

В последней мысли старайтесь избегать использования e.printStackTrace(); В приложениях для Android. Вместо этого используйте Log.e("TAG_STRING", e.getMessage(), e); Для печати ошибок в системе регистрации Android, доступ к которой вы можете получить с помощью logcat .

В целом, это должно выглядеть примерно так:

  try { mMediaPlayer.setDataSource(videoString); holder = mPreview.getHolder(); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepareAsync(); } catch (IllegalArgumentException e) { Log.e("TAG_STRING", e.getMessage(), e); } catch (SecurityException e) { Log.e("TAG_STRING", e.getMessage(), e); } catch (IllegalStateException e) { Log.e("TAG_STRING", e.getMessage(), e); } catch (IOException e) { Log.e("TAG_STRING", e.getMessage(), e); } 
Intereting Posts
«Список <T>» не может содержать объекты типа типа «Объект» Классы Java по сравнению с классами C ++ Как сохранить конфиденциальную информацию в бинарнике на стороне клиента? Приложение Android Tablet – ActionBar Что такое регистрация SRIB_DCS в лог-кадре Android и как его остановить? Android NSD не обнаруживает всех сервисов Исключение OutOfMemory при преобразовании ByteArray в String? Значение в edittext не отображается до тех пор, пока оно не начнет фокусироваться. Android Android – Интервал между CheckBox и текстом Редактирование smali. Проблема. Низкие 16 бит должны быть обнулены. Является ли шестнадцатеричный идентификатор неправильным? Ошибка в настройке pjsip для Android Рекомендуемый шаблон проектирования для записи в базу данных SQLite на Android Образец лицензирования Android возвращает код 3. Что это значит? «Кнопка« Назад »с помощью панели инструментов getSupportActionbar и appcompat v7 Java.lang.IllegalStateException в android.media.MediaRecorder.start при вызове MediaRecorder.start в onLongClickListener