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
. Этот ответ указал мне на решение.