android 安卓媒体播放器java.io. IO异常:准备失败,原因:状态=0x1

u0njafvf  于 2022-12-02  发布在  Android
关注(0)|答案(6)|浏览(488)

我正在使用Android的MediaPlayer在我的应用程序中设置URL流。我已经尝试了几个不同的帖子来处理退出代码和错误:(1,-2147483648)的数据。
我已经尝试了几种不同的流,但我似乎不能让MediaPlayer工作。我曾想过移动谷歌的ExoPlayer,但它有点复杂,我不想跳槽,以防我错过了什么。
媒体播放器:

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 error (1, -2147483648))。我不认为这是一个源问题,因为我已经尝试了多个其他流。请让我知道,如果我跳过了一些关键的,可能是导致我的错误。

编辑如果有帮助的话,我一直在调查我的调用,我发现MediaPlayer从来没有调用onPrepared(...)。我检查了我测试的所有媒体的内容类型,它们都是音频/MPEG头。所以我不明白为什么MediaPlay没有访问onPrepared。

aoyhnmkz

aoyhnmkz1#

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

onPrepared呼叫(秒)。
在android 9中,请检查https://developer.android.com/training/articles/security-config
AndroidManifest.xml添加网络安全配置属性

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

在src/res/xml中添加网络安全配置. 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>
euoag5mw

euoag5mw2#

使用此代码尝试使用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();
        }
    }

请确保您在清单文件中定义了权限

一个月一个月

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

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

参考:https://developer.android.com/training/articles/security-config

网络安全配置

通过网络安全配置功能,应用可以在安全的声明性配置文件中自定义其网络安全设置,而无需修改应用代码。可以为特定域和特定应用配置这些设置。此功能的主要功能如下:

  • 自订信任起点:自定义应用的安全连接所信任的证书颁发机构(CA)。例如,信任特定的自签名证书或限制应用信任的公共CA集。
  • 仅两柴覆写:安全地调试应用程序中的安全连接,而不会给安装基础带来额外风险。
  • 明文流量选择退出:防止应用意外使用明文流量。
  • 证书锁定:限制应用程序与特定证书的安全连接。

添加网络安全配置文件

网络安全配置功能使用一个XML文件,您可以在其中指定应用的设置。您必须在应用的清单中包含一个条目以指向此文件。以下代码摘录自清单,演示如何创建此条目:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

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>
3xiyfsfu

3xiyfsfu3#

我的raw文件夹中有一个本地音乐文件,这个错误在特定设备上不断发生。原来问题出在文件格式上。将其从.m4a更改为.mp3,问题就解决了。
我猜这是与设备支持的编解码器相关的设备特定问题。

6rqinv9w

6rqinv9w4#

在我的情况下,我用这个代码解决了这个错误,因为我在华为模型中收到错误。

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

}
sxissh06

sxissh065#

我的问题可能与您的问题有不同的原因,但由于我来到这里时出现了相同的错误消息,下面是我如何修复它:
在我的情况下,我试图阅读一个视频,我已经创建了我的电脑上与opencv和复制到手机。
我将其编码为MJPG的错误,而我应该使用H264.This answer,这为我指明了解决方案。

webghufk

webghufk6#

我解决了这个问题,通过改变我的文件到另一个名称,我的音频文件的初始文件名是“john:doe.wav”,Mediaplayer不能播放一个文件与这个“:“特殊字符和许多其他字符,所以改变文件名为“johndoe.wav”解决了这个问题。

相关问题