Intereting Posts
Android httpPost с параметрами и файлом Как удалить активность из списка последних приложений? Как легко удалить ненужные ресурсы локализации из добавленных библиотек в релизе APK Как удалить комментарии в необработанных XML-файлах с помощью Gradle, когда файл упакован Android – Sencha Touch 2 PhoneGap для 4.0.x Ящик навигации (menudrawer) Android 5 (леденец) стиль Android: ViewPager застревает между видами Запрос оператора при нажатии кнопки «Назад» Я потерял файл .keystore? Намерение камеры не сохраняет фото Как RecyclerView ItemTouchHelper блокирует салфетки? Как открыть счетчик одним щелчком мыши, когда открыт другой счетчик Невозможно разместить плавучую кнопку действия (FAB) между заголовком и элементами в DrawerLayout с помощью RecyclerView Android: хронометр как постоянный секундомер. Как установить время начала? Что такое хронометр «База»? Android: Как мне вызвать startResolutionForResult из службы?

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

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

Используйте 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); }