Ошибка MediaPlayer (1, -1004), а также MEDIA_ERROR_IO, пытающаяся передать музыку на Samsung S3

ПРИМЕЧАНИЕ. Я не работаю в компании, где я работал, когда я разместил этот вопрос, поэтому, несмотря на то, что могут возникнуть некоторые большие ответы, я не буду их тестировать, так как у меня нет причин (кроме содействие сообществу, которое может заставить меня сделать это однажды) .

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

Тем временем, я надеюсь, что некоторые из ответов могут помочь некоторым из вас также столкнуться с этой проблемой. Yay для переполнения стека!


Наше приложение должно транслировать музыку из онлайн-источника (я не имею права раскрывать этот источник).

Почему для запуска streamовой передачи на S3 требуется 2 минуты?

Мне удалось выяснить, что объект Media Player переходит в состояние ошибки из-за MEDIA_ERROR_UNKOWN – отлично. Мне не очень помогает. Поэтому, обрабатывая это в onError с помощью OnErrorListener, я перезапускаю объект Media Player, а затем вызываю startPlaying, который делает остальные – настройку источника данных и т. Д.

Пользователи:

private ProgressBar playSeekBar; private ImageView ivPlay; private ImageView ivPause; private ImageView ivBuffer; private MediaPlayer mPlayer; private ImageView ivInfo; private AudioManager audio; 

Инициализация Media Player (и Visualizer – это не проблема для цели этого вопроса)

 private void initialMediaPlayerAndVisualizer() { Log.d(TAG, "Initial Media Player and Visualizer"); playSeekBar = (ProgressBar) findViewById(R.id.progressBar1); playSeekBar.setMax(100); playSeekBar.setVisibility(View.GONE); mPlayer = new MediaPlayer(); Log.d(TAG, "Create onErrorListener"); MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.d(TAG, "OnError - Error code: "+what+" Extra code: "+extra); switch(what){ case -1004: Log.d("Streaming Media", "MEDIA_ERROR_IO"); break; case -1007: Log.d("Streaming Media", "MEDIA_ERROR_MALFORMED"); break; case 200: Log.d("Streaming Media", "MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK"); break; case 100: Log.d("Streaming Media", "MEDIA_ERROR_SERVER_DIED"); break; case -110: Log.d("Streaming Media", "MEDIA_ERROR_TIMED_OUT"); break; case 1: Log.d("Streaming Media", "MEDIA_ERROR_UNKNOWN"); break; case -1010: Log.d("Streaming Media", "MEDIA_ERROR_UNSUPPORTED"); break; } switch(extra){ case 800: Log.d("Streaming Media", "MEDIA_INFO_BAD_INTERLEAVING"); break; case 702: Log.d("Streaming Media", "MEDIA_INFO_BUFFERING_END"); break; case 701: Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE"); break; case 802: Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE"); break; case 801: Log.d("Streaming Media", "MEDIA_INFO_NOT_SEEKABLE"); break; case 1: Log.d("Streaming Media", "MEDIA_INFO_UNKNOWN"); break; case 3: Log.d("Streaming Media", "MEDIA_INFO_VIDEO_RENDERING_START"); break; case 700 : Log.d("Streaming Media", "MEDIA_INFO_VIDEO_TRACK_LAGGING"); break; } Log.d("Streaming Media", "Reset media player"); mPlayer.reset(); // We need to link the visualizer view to the media player so that it displays something mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView); //Send the visualizerContainer to the Renderer visualizerRenderer = new VisualizerRenderer(arrayVisualizer); mVisualizerManager.addRenderer(visualizerRenderer); try { startPlaying(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } }; Log.d(TAG, "Set error listener on Media Player object"); mPlayer.setOnErrorListener(errorListener); // We need to link the visualizer view to the media player so that it displays something mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView); //Send the visualizerContainer to the Renderer visualizerRenderer = new VisualizerRenderer(arrayVisualizer); mVisualizerManager.addRenderer(visualizerRenderer); try { startPlaying(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } за private void initialMediaPlayerAndVisualizer() { Log.d(TAG, "Initial Media Player and Visualizer"); playSeekBar = (ProgressBar) findViewById(R.id.progressBar1); playSeekBar.setMax(100); playSeekBar.setVisibility(View.GONE); mPlayer = new MediaPlayer(); Log.d(TAG, "Create onErrorListener"); MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.d(TAG, "OnError - Error code: "+what+" Extra code: "+extra); switch(what){ case -1004: Log.d("Streaming Media", "MEDIA_ERROR_IO"); break; case -1007: Log.d("Streaming Media", "MEDIA_ERROR_MALFORMED"); break; case 200: Log.d("Streaming Media", "MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK"); break; case 100: Log.d("Streaming Media", "MEDIA_ERROR_SERVER_DIED"); break; case -110: Log.d("Streaming Media", "MEDIA_ERROR_TIMED_OUT"); break; case 1: Log.d("Streaming Media", "MEDIA_ERROR_UNKNOWN"); break; case -1010: Log.d("Streaming Media", "MEDIA_ERROR_UNSUPPORTED"); break; } switch(extra){ case 800: Log.d("Streaming Media", "MEDIA_INFO_BAD_INTERLEAVING"); break; case 702: Log.d("Streaming Media", "MEDIA_INFO_BUFFERING_END"); break; case 701: Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE"); break; case 802: Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE"); break; case 801: Log.d("Streaming Media", "MEDIA_INFO_NOT_SEEKABLE"); break; case 1: Log.d("Streaming Media", "MEDIA_INFO_UNKNOWN"); break; case 3: Log.d("Streaming Media", "MEDIA_INFO_VIDEO_RENDERING_START"); break; case 700 : Log.d("Streaming Media", "MEDIA_INFO_VIDEO_TRACK_LAGGING"); break; } Log.d("Streaming Media", "Reset media player"); mPlayer.reset(); // We need to link the visualizer view to the media player so that it displays something mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView); //Send the visualizerContainer to the Renderer visualizerRenderer = new VisualizerRenderer(arrayVisualizer); mVisualizerManager.addRenderer(visualizerRenderer); try { startPlaying(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } }; Log.d(TAG, "Set error listener on Media Player object"); mPlayer.setOnErrorListener(errorListener); // We need to link the visualizer view to the media player so that it displays something mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView); //Send the visualizerContainer to the Renderer visualizerRenderer = new VisualizerRenderer(arrayVisualizer); mVisualizerManager.addRenderer(visualizerRenderer); try { startPlaying(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

Начало игры:

 private void startPlaying () throws IllegalStateException, IOException, UnsupportedOperationException { if(mPlayer != null){ ivPause.setVisibility(View.INVISIBLE); ivPlay.setVisibility(View.INVISIBLE); ivBuffer.setVisibility(View.VISIBLE); mVisualizerManager.link(mPlayer); mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { public void onBufferingUpdate(MediaPlayer mp, int percent) { playSeekBar.setSecondaryProgress(percent); Log.i("Buffering", "" + percent); } }); try { mPlayer.setDataSource(theSource); } catch (IllegalArgumentException e) { Log.d(TAG, "Illegal Argument Exception: "+e); e.printStackTrace(); } catch (IllegalStateException e) { Log.d(TAG, "Illegal State Exception: "+e); e.printStackTrace(); } catch (IOException e) { Log.d(TAG, "IO Exception: "+e); e.printStackTrace(); } mPlayer.prepareAsync(); mPlayer.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { ivBuffer.setVisibility(View.INVISIBLE); bars.setVisibility(View.INVISIBLE); visualizerContainer.setVisibility(View.VISIBLE); ivInfo.setImageResource(R.drawable.img_radio_info_online); ivPause.setVisibility(View.VISIBLE); ivPlay.setVisibility(View.INVISIBLE); //Mute the video if the phone is muted. if ((audio.getRingerMode() == AudioManager.RINGER_MODE_SILENT) || (audio.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE)) { mp.setVolume(0, 0); Toast toast = Toast.makeText(context, R.string.device_muted, Toast.LENGTH_LONG); toast.show(); } mPlayer.start(); } }); }else{ Log.d(TAG, "Media player is null."); initialMediaPlayerAndVisualizer(); } } в private void startPlaying () throws IllegalStateException, IOException, UnsupportedOperationException { if(mPlayer != null){ ivPause.setVisibility(View.INVISIBLE); ivPlay.setVisibility(View.INVISIBLE); ivBuffer.setVisibility(View.VISIBLE); mVisualizerManager.link(mPlayer); mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { public void onBufferingUpdate(MediaPlayer mp, int percent) { playSeekBar.setSecondaryProgress(percent); Log.i("Buffering", "" + percent); } }); try { mPlayer.setDataSource(theSource); } catch (IllegalArgumentException e) { Log.d(TAG, "Illegal Argument Exception: "+e); e.printStackTrace(); } catch (IllegalStateException e) { Log.d(TAG, "Illegal State Exception: "+e); e.printStackTrace(); } catch (IOException e) { Log.d(TAG, "IO Exception: "+e); e.printStackTrace(); } mPlayer.prepareAsync(); mPlayer.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { ivBuffer.setVisibility(View.INVISIBLE); bars.setVisibility(View.INVISIBLE); visualizerContainer.setVisibility(View.VISIBLE); ivInfo.setImageResource(R.drawable.img_radio_info_online); ivPause.setVisibility(View.VISIBLE); ivPlay.setVisibility(View.INVISIBLE); //Mute the video if the phone is muted. if ((audio.getRingerMode() == AudioManager.RINGER_MODE_SILENT) || (audio.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE)) { mp.setVolume(0, 0); Toast toast = Toast.makeText(context, R.string.device_muted, Toast.LENGTH_LONG); toast.show(); } mPlayer.start(); } }); }else{ Log.d(TAG, "Media player is null."); initialMediaPlayerAndVisualizer(); } } 

Хватит играть:

 private void stopPlaying() { bars.setVisibility(View.VISIBLE); visualizerContainer.setVisibility(View.INVISIBLE); ivInfo.setImageResource(R.drawable.img_radio_info_offline); ivPlay.setVisibility(View.VISIBLE); ivPause.setVisibility(View.INVISIBLE); mPlayer.stop(); mVisualizerManager.release(); mPlayer.release(); mPlayer = null; } 

Маленькие журналы:

 05-21 16:26:23.600: I/Buffering(3921): 0 05-21 16:26:23.600: I/MediaPlayer(3921): Info (703,156) 05-21 16:26:23.600: I/MediaPlayer(3921): Info (701,0) 05-21 16:26:23.610: D/VisualizerRenderer(3921): Render columns 05-21 16:26:23.715: V/MediaPlayer(3921): message received msg=100, ext1=1, ext2=-110 05-21 16:26:23.715: E/MediaPlayer(3921): error (1, -110) 05-21 16:26:23.715: V/MediaPlayer(3921): callback application 05-21 16:26:23.715: V/MediaPlayer(3921): back from callback 05-21 16:26:23.725: D/VisualizerRenderer(3921): Render columns 05-21 16:26:23.725: E/MediaPlayer(3921): Error (1,-110) 05-21 16:26:23.725: D/MAIN(3921): OnError - Error code: 1 Extra code: -110 05-21 16:26:23.725: D/Streaming Media(3921): MEDIA_ERROR_UNKNOWN 05-21 16:26:23.725: D/Streaming Media(3921): Reset media player 05-21 16:26:23.725: V/MediaPlayer-JNI(3921): reset 05-21 16:26:23.725: V/MediaPlayer(3921): reset 05-21 16:26:23.730: D/VisualizerRenderer(3921): Divisions: 9 05-21 16:26:23.730: D/VisualizerManager(3921): Added te renderer 05-21 16:26:23.730: V/MediaPlayer-JNI(3921): get_session_id() 05-21 16:26:23.735: D/VisualizerManager(3921): Media player and visualizer linked 05-21 16:26:23.735: D/VisualizerManager(3921): Set capture listener 05-21 16:26:23.735: D/VisualizerManager(3921): Set on visualizer complete listener 05-21 16:26:23.740: V/MediaPlayer(3921): setVideoSurfaceTexture 05-21 16:26:23.740: V/MediaPlayer(3921): prepareAsync 05-21 16:26:25.285: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:25.285: V/MediaPlayer(3921): buffering 0 05-21 16:26:25.285: V/MediaPlayer(3921): callback application 05-21 16:26:25.285: V/MediaPlayer(3921): back from callback 05-21 16:26:25.330: I/Buffering(3921): 0 05-21 16:26:25.390: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:25.390: V/MediaPlayer(3921): buffering 0 05-21 16:26:25.390: V/MediaPlayer(3921): callback application 05-21 16:26:25.390: V/MediaPlayer(3921): back from callback 05-21 16:26:25.425: I/Buffering(3921): 0 05-21 16:26:25.490: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:25.490: V/MediaPlayer(3921): buffering 0 05-21 16:26:25.490: V/MediaPlayer(3921): callback application 05-21 16:26:25.490: V/MediaPlayer(3921): back from callback ... 05-21 16:26:52.585: I/Buffering(3921): 0 05-21 16:26:53.570: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:53.570: V/MediaPlayer(3921): buffering 0 05-21 16:26:53.570: V/MediaPlayer(3921): callback application 05-21 16:26:53.570: V/MediaPlayer(3921): back from callback 05-21 16:26:53.585: I/Buffering(3921): 0 05-21 16:26:54.570: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:54.570: V/MediaPlayer(3921): buffering 0 05-21 16:26:54.570: V/MediaPlayer(3921): callback application 05-21 16:26:54.570: V/MediaPlayer(3921): back from callback 05-21 16:26:54.570: V/MediaPlayer(3921): message received msg=200, ext1=702, ext2=0 05-21 16:26:54.570: W/MediaPlayer(3921): info/warning (702, 0) 05-21 16:26:54.570: V/MediaPlayer(3921): callback application 05-21 16:26:54.570: V/MediaPlayer(3921): back from callback 05-21 16:26:54.590: I/Buffering(3921): 0 05-21 16:26:54.590: I/MediaPlayer(3921): Info (702,0) 05-21 16:26:55.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:55.575: V/MediaPlayer(3921): buffering 0 05-21 16:26:55.575: V/MediaPlayer(3921): callback application 05-21 16:26:55.575: V/MediaPlayer(3921): back from callback 05-21 16:26:55.575: I/Buffering(3921): 0 05-21 16:26:56.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:56.575: V/MediaPlayer(3921): buffering 0 05-21 16:26:56.575: V/MediaPlayer(3921): callback application 05-21 16:26:56.575: V/MediaPlayer(3921): back from callback 05-21 16:26:56.585: I/Buffering(3921): 0 05-21 16:26:57.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0 05-21 16:26:57.575: V/MediaPlayer(3921): buffering 0 05-21 16:26:57.575: V/MediaPlayer(3921): callback application 05-21 16:26:57.575: V/MediaPlayer(3921): back from callback 05-21 16:26:57.600: I/Buffering(3921): 0 05-21 16:26:57.930: V/MediaPlayer-JNI(3921): stop 05-21 16:26:57.930: V/MediaPlayer(3921): stop 05-21 16:26:57.930: D/VisualizerManager(3921): Released the visualizer 05-21 16:26:57.930: V/MediaPlayer-JNI(3921): release 05-21 16:26:57.930: V/MediaPlayer(3921): setListener 05-21 16:26:57.930: V/MediaPlayer(3921): disconnect 05-21 16:26:57.935: V/MediaPlayer(3921): destructor 05-21 16:26:57.935: V/MediaPlayer(3921): disconnect 

    Ответ на этот вопрос оказался проблемой для прошивки Android, установленной на устройствах Samsung S III под управлением Android 4.1.2.

    Казалось, что это что-то касалось источника streamа, потому что некоторые источники в конечном итоге играли на устройстве, но тот, который нам нужен, никогда не играл.

    Если вы можете получить свой stream из другого источника, он должен работать.

    Поэтому, если вы разрабатываете приложение для определенной компании / цели и имеете некоторый контроль над источником streamа или можете общаться с людьми, контролирующими источник streamа, заставить их изменить источник streamа на что-то который будет работать на Samsung S III под управлением Android 4.1.2.

    Помимо этого все, что решит это, – это обновление прошивки.

    Для всех, кто борется с этой проблемой, вот решение:

    Android MediaPlayer занимает много времени для подготовки и буферизации

    EDIT: предыдущее решение не очень полно, потому что иногда можно услышать «заикание» игрока, когда оно приостанавливается и возобновляется.

    100% -ый ответ java, который немного более изящный, включает использование экземпляра MediaCodec для преобразования mp3 в данные PCM для подачи на экземпляр AudioTrack.

    Я опубликовал полный исходный код и объяснение здесь: http://www.piterwilson.com/blog/2014/03/15/mediacodec-mediaextractor-and-audiotrack-to-the-rescue/

    Я решил эту проблему, используя библиотеку
    compile ‘com.devbrackets.android:exomedia:3.0.1’

    Определенное решение для некоторых, получающих -1004 на старых телефонах Samsung:

    В моем случае я использую Samsung Galaxy Pocket и имел mp3-файл на нашем CDN, который не играл бы, т. Е.

    HTTP: // домен / путь / аудиофайл

    Однако при загрузке файла на телефон он воспроизводится в основном проигрывателе. Однако не в моем приложении, а не в браузерах. Оказывается, службе медиаплеера требуется расширение файла, чтобы намекнуть на тип носителя и не удалось автоматически обнаружить на основе заголовков файлов.

    Я решил это, указав местоположение файла фактическим расширением.

    Http: //domain/path/audiofile.mp3

    Решение

    1. Либо дайте файлу расширение, на котором оно размещено (как указано выше), либо
    2. Программно загрузите файл вручную, верните его на SD-карте и затем откройте SDK в качестве источника.
    Interesting Posts

    Как вернуть файл (FileContentResult) в ASP.NET WebAPI

    Понимание Android: Zygote и DalvikVM

    Обновление Microsoft (MSU) не находит обновлений для других продуктов Microsoft (например, Office) после обновления MSU

    Получение ошибки «команда не найдена» при сравнении двух строк в Bash

    Разделение на запятую вне цитат

    Оставляет ли перемещение объект в пригодном для использования состоянии?

    Как я могу получить USB-устройства, работающие с BeagleBoard xM и Yocto project Linux?

    Как подключиться к беспроводной сети, используя только командную строку в Linux?

    Сделайте UEFI, GPT, загрузчик, SSD, USB, Linux и Windows работать вместе

    Qt5. Вставить объект QWidget в QML

    Каков наилучший фильтр Core Image для получения черно-белых эффектов?

    существует ли эквивалент Java, эквивалентный нулевому коалесцирующему оператору (??) в C #?

    Android: для чего используется android.R.id.content?

    Какова цель выражения «new String (…)» в Java?

    Как сделать Windows 7 точкой доступа WIFI для Android?

    Давайте будем гением компьютера.