Android MediaPlayer java.io.IOException: подготовка не удалась.: status=0x1

Я использую MediaPlayer Android для настройки потока URL в моем приложении. Я пробовал несколько разных постов, чтобы разобраться с кодом выхода и ошибкой: (1, -2147483648).

Я попытался несколько разных потоков, но я не могу заставить MediaPlayer работать. Я думал о перемещении по ExoPlayer от Google, но это немного сложнее, и я не хочу прыгать с корабля в случае, если я что-то упустил.

Медиа-плейер:

private MediaPlayer player;
String url = "http://199.180.75.118:80/stream";     //temp stream
private void initializeMediaPlayer() {
    player = new MediaPlayer();
    player.setAudioAttributes( new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .build());

    try { 
        player.setDataSource(url);
        player.prepareAsync();
        player.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

Я также включил разрешение Android:

<uses-permission android:name="android.permission.INTERNET" /> 

Я попытался использовать исходный тип потока (но он выдает устаревшее предупреждение):

player.setAudioStreamType(AudioManager.STREAM_MUSIC);

Поэтому вместо этого я использовал .setAudioAttributes(...)Я пытался просто бежать prepare() вместо prepareAsync() который дал название проблемы, но я все еще приводить к той же ошибке. Я также посмотрел на определение фактической ошибки, но безуспешно (ошибка Android MediaPlayer (1, -2147483648)). Я не думаю, что это проблема источника, так как я пробовал несколько других потоков. Пожалуйста, дайте мне знать, если я пропущу что-то важное, что может быть причиной моей ошибки.

Редактировать Если это вообще помогает, я изучал свои звонки и обнаружил, что MediaPlayer никогда не звонит onPrepared(...), Я проверил Content-Types всех медиа, которые я тестировал, и все они были аудио /MPEG заголовками. Поэтому я не понимаю, почему MediaPlay не обращается к onPrepared.

6 ответов

Решение
private void initializeMediaPlayer() {
        player = new MediaPlayer();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            player.setAudioAttributes(new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setLegacyStreamType(AudioManager.STREAM_MUSIC)
                    .build());
        } else {
            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
        try {
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
            player.setDataSource(url);
            player.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Готовый звонок за считанные секунды.

В андроиде 9 проверьте это https://developer.android.com/training/articles/security-config

AndroidManifest.xml добавить атрибуты networkSecurityConfig

...
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
...

в src/res/xml добавьте файл network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

Попробуйте с этим кодом протестировано с real device Vivo V7+ Android 8.1.0

    private MediaPlayer player;
    String url = "http://199.180.75.118:80/stream";     //temp stream
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void initializeMediaPlayer() {
        player = new MediaPlayer();
        player.setAudioAttributes( new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build());

        try {
            //change with setDataSource(Context,Uri);
            player.setDataSource(this, Uri.parse(url));
            player.prepareAsync();
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    //mp.start();
                    player.start();
                }
            });
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Убедитесь, что вы определили разрешение в файле манифеста

Manifest.xml

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<Application
  android:usesCleartextTraffic="true"
  ....
  >
  //.....
  </Application>

Я решил эту проблему, изменив свой файл на другое имя, начальное имя моего аудиофайла было «john:doe.wav», Mediaplayer не может воспроизводить файл с этим специальным символом «:» и многими другими символами, поэтому изменив имя файла на "johndoe.wav" решил проблему.

В моем случае я решил эту ошибку с помощью этого кода, потому что я получал ошибку в моделях Huawei.

      private void setUpMediaRecorder() {
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mMediaRecorder.setOutputFile(mVideoFileName);
    mMediaRecorder.setVideoEncodingBitRate(10000000);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setVideoSize(320, 240);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    switch (mSensorOrientation) {
        case SENSOR_ORIENTATION_DEFAULT_DEGREES:
            mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
            break;
        case SENSOR_ORIENTATION_INVERSE_DEGREES:
            mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
            break;
    }
    try {
        mMediaRecorder.prepare();
    } catch (Exception e) {
        e.printStackTrace();
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mMediaRecorder.setOutputFile(mVideoFileName);
        mMediaRecorder.setVideoEncodingBitRate(10000000);
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoSize(320, 240);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        switch (mSensorOrientation) {
            case SENSOR_ORIENTATION_DEFAULT_DEGREES:
                mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
                break;
            case SENSOR_ORIENTATION_INVERSE_DEGREES:
                mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
                break;
        }
        try {
            mMediaRecorder.prepare();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

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

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

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

В моем случае я пытался прочитать видео, которое я создал на своем компьютере с помощью opencv и скопировал на телефон.

Ошибка, которую я закодировал какMJPGкогда я должен был использоватьH264. Этот ответ указал мне на решение.

Другие вопросы по тегам