web-dev-qa-db-ja.com

Android MediaPlayerは「準備に失敗しました。:status = 0x1」を2.1でスローし、2.2で動作します

MediaPlayerクラスにAndroid 2.1でh.264エンコードされたビデオを再生させようとすることを試みて、テーブルに対して本当に頭を打ちました。

_  AssetFileDescriptor fileDescriptor = getResources().openRawResourceFd(R.raw.my_movie);
  introMoviePlayer = new MediaPlayer();
  introMoviePlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
  introMoviePlayer.prepare();
_

これは、prepare()で常にテキスト_Java.io.IOException: Prepare failed.: status=0x1_で例外をスローします。 MediaPlayer.create()をURIで使用すると、prepare()でスローされ、_MediaPlayer.create()によって実際に呼び出され、メッセージ_Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration_。

Froyo(2.2)でも同じコードが完全に機能します。ビデオ自体は、ビデオプレーヤーアプリで正常に再生されます。おそらく誰もがこの問題を解決するのに役立つかもしれない有用なヒントを持っていますか?

編集:まだ解決策がありません-非常にイライラする問題です。ただし、VideoViewを作成し、未加工の動画のURIを設定することにより、機能することがわかりました。 MediaPlayerクラスを介してまったく同じURIを送信するとスローされるため、これは非常に不可解です。

32
Nik Reiman

これがあなたの問題かどうかはわかりませんが、先ほどTuszyが説明した問題の解決策を見つけました。作成中のファイルを外部ストレージから読み取ることはできましたが、キャッシュから読み取ることはできませんでした。

解決策は、ファイルの書き込み時の読み取り書き込み許可が異なることです。

私が見つけたこのブログでこの素晴らしい説明をご覧ください。

http://blog.weston-fl.com/Android-mediaplayer-prepare-throws-status0x1-error1-2147483648/

enter image description here

enter image description here

17
Ryan Heitner

これは私の解決策です:

MediaPlayer mediaPlayer = new MediaPlayer();
FileInputStream fis = null;
try {
    fis = new FileInputStream(mp3File);
    mediaPlayer.setDataSource(fis.getFD());
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.prepare();
}   finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException ignore) {
        }
    }

}
29
MadMurdok

私はここに遅れていることを知っていますが、うまくいけば、これは他の誰かに役立つでしょうこの問題を回避するには、メディアの再生が完了した後にMediaPlayerオブジェクトを明示的に解放するsetOnCompletionListenerコールバックを設定しました。

もともとロニーがここに投稿したため、このソリューションは信用できません: サウンドファイルが終了したことをどのように検出しますか?

しかし、これはAndroid + Failed Status 0x1を検索するときの最初の答えなので、この問題を解決した私のコードは次のとおりです:

 public void playSound(String soundPath){
    MediaPlayer m = new MediaPlayer();

    m.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }

    });

    try {

        AssetFileDescriptor descriptor = mContext.getAssets().openFd(soundPath);
        m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(),
                        descriptor.getLength());            

        descriptor.close();

        m.prepare();
        m.setVolume(100f, 100f);
        m.setLooping(false);
        m.start();

    } catch (Exception e) {
        //Your catch code here.
    }
 }   
7
Anthony Roe

MediaPlayerの複数のインスタンスを使用している場合、別のインスタンスで使用する前に、リソースでrelease()を実行したことを確認してください。

5
Paul Lammertsma

fileName、media Playerインスタンスを初期化します。

private MediaPlayer mp;
private final static String fileName = "ring";

res/rawディレクトリからオーディオファイルを再生/開始する場合:

        try 
        {   
            mp = new MediaPlayer();
            mp.setAudioStreamType(AudioManager.STREAM_RING); //set streaming according to ur needs
            mp.setDataSource(Context, Uri.parse("Android.resource://yourAppPackageName/raw/"+fileName));
            mp.setLooping(true);
            mp.prepare();
            mp.start();

        } catch (Exception e) 
        {
            System.out.println("Unable to TunePlay: startRingtone(): "+e.toString());
        }

最後にaudioFileを停止します:

    try
    {
        if (!(mp == null) && mp.isPlaying())
        {
            mp.stop();
            mp.release(); //its a very good practice
        }       
    }
    catch (Exception e)
    {
        System.out.println("Unable to  TunePlay: stopRingtone():"+e.toString());
    }
2
ani0904071

私はこれが手遅れかもしれないことを知っています。リソースのビデオを次のように使用できました。

MediaPlayer mp = ...;
Uri uri = Uri.parse("Android.resource://com.example.myapp/" + R.raw.my_movie");
mp.setDataSourceUri(this, uri);
2
Aleks G

私の意見では、メディアファイルの場所を確認してください<< SONG PATH or MOVIE PATH >>。私はこの例外に直面しました、私は正しい「SONG PATH」によって克服しました

2
SAWAUNG

同様の問題がありました。圧縮されたサウンドファイルを含むZipファイルがありました。それらをMediaPlayerに渡すには、圧縮を解除する必要がありました。アプリケーションのキャッシュディレクトリ(context.getCacheDir())内に配置すると、MediaPlayerは、説明したものと同じエラーを返しました。

しかし、それらを外部ストレージ(Environment.getExternalStorageDirectory())に配置すると、すべてが機能し始めました。

2
srgtuszy

最初にあなたのコードに感謝します。オープンな生のリソースが私の問題を助けてくれました。

問題に対する明確な答えがありませんが、SDKのAPIメディアの例とプロジェクトのメディアプレーヤーに基づいて、ファイルが正しく開くことを確認することをお勧めします。

それ以外の場合は、準備する前にディスプレイを設定する必要があります。

mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();

これらは私が持っている唯一のアイデアです

それが役に立てば幸い

ジェイソン

1
Jason Rogers

このエラーの最良かつ明確な解決策を見つけました:Java.io.IOException: Prepare failed.: status=0x1

あなたはあなたのSDカードから読み取り、このエラーが発生した場合、あなたは設定されていません
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>あなたのマニファストで。

注2

あなたがURLからプレイしたい場合、そのエラーが発生した場合は、setDataSourceがこのように設定されている可能性があります:https://www.Android.comこのようにhttpからSを削除しますhttp://www.Android.com

1
erfan

私の場合、それは好きではない単なるファイル名でした:
/storage/emulated/0/appname/2018-03-12T11:52:08Z.wav
ハイフンとコロンを削除すると、例外はなくなりました。

1
Ben

リモートURLを扱っている場合は、以下のコードを使用して、MediaPlayerと互換性のあるエンコードされたURLを取得してください。

public String getEncodedURL(String urlStr) throws Exception 
{
            URL url = new URL(urlStr);
            URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
            urlStr = uri.toASCIIString();
            return urlStr;
}
1
Rakesh Patil

rawフォルダーにあるビデオまたはオーディオファイルを再生するには:

mMediaPlayer = MediaPlayer.create(this, R.raw.a_video_or_audio_file);
mMediaPlayer.start(); 

mediaPlayer.create(Context、R.raw.some_resource_file)を使用するときにprepare()を呼び出す必要はありません

0
TouchBoarder

wmvaの代わりにmp3ファイルを再生すると修正されました。どうやらそれはAPI 19の問題ではないようです

0
sam winston