Intereting Posts
Экран диалогового окна Android за блокировкой Что использовать вместо getSupportActionBar () в библиотеке 22? Как передать значения из одного действия в предыдущую деятельность "Java.lang.IllegalArgumentException: никакие конфиги не соответствуют configSpec" При открытии камеры Intent Как реализовать функцию отказа от Google Analytics в Android? NoClassDefFoundError с помощью Jackson 2.2.x на Android с Gradle Лучше ли использовать AsyncTask (или таймер) в рамках одного процесса или использовать Сервис в отдельном процессе? Невозможно воспроизвести определенные видеоролики Facebook SDK 3.0 – получить идентификатор пользователя Facebook и токен доступа EditText внутри потерянного фокуса ListView Меню настраиваемых опций в Android Найти геодезическую точку центра между точкой начала и конечной точки геодезии на андроиде «Break On Exception» в Eclipse / Android Как полностью покрыть 9-PATCH-PNG? Имеет ли Android какой-либо API для предоставления даты-времени в качестве ввода от пользователя (startActivityForResult)?

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); }