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を送信するとスローされるため、これは非常に不可解です。
これがあなたの問題かどうかはわかりませんが、先ほどTuszyが説明した問題の解決策を見つけました。作成中のファイルを外部ストレージから読み取ることはできましたが、キャッシュから読み取ることはできませんでした。
解決策は、ファイルの書き込み時の読み取り書き込み許可が異なることです。
私が見つけたこのブログでこの素晴らしい説明をご覧ください。
http://blog.weston-fl.com/Android-mediaplayer-prepare-throws-status0x1-error1-2147483648/
これは私の解決策です:
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) {
}
}
}
私はここに遅れていることを知っていますが、うまくいけば、これは他の誰かに役立つでしょうこの問題を回避するには、メディアの再生が完了した後に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.
}
}
MediaPlayer
の複数のインスタンスを使用している場合、別のインスタンスで使用する前に、リソースでrelease()
を実行したことを確認してください。
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());
}
私はこれが手遅れかもしれないことを知っています。リソースのビデオを次のように使用できました。
MediaPlayer mp = ...;
Uri uri = Uri.parse("Android.resource://com.example.myapp/" + R.raw.my_movie");
mp.setDataSourceUri(this, uri);
私の意見では、メディアファイルの場所を確認してください<< SONG PATH or MOVIE PATH >>。私はこの例外に直面しました、私は正しい「SONG PATH」によって克服しました
同様の問題がありました。圧縮されたサウンドファイルを含むZipファイルがありました。それらをMediaPlayer
に渡すには、圧縮を解除する必要がありました。アプリケーションのキャッシュディレクトリ(context.getCacheDir()
)内に配置すると、MediaPlayer
は、説明したものと同じエラーを返しました。
しかし、それらを外部ストレージ(Environment.getExternalStorageDirectory()
)に配置すると、すべてが機能し始めました。
最初にあなたのコードに感謝します。オープンな生のリソースが私の問題を助けてくれました。
問題に対する明確な答えがありませんが、SDKのAPIメディアの例とプロジェクトのメディアプレーヤーに基づいて、ファイルが正しく開くことを確認することをお勧めします。
それ以外の場合は、準備する前にディスプレイを設定する必要があります。
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
これらは私が持っている唯一のアイデアです
それが役に立てば幸い
ジェイソン
このエラーの最良かつ明確な解決策を見つけました: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
私の場合、それは好きではない単なるファイル名でした:
/storage/emulated/0/appname/2018-03-12T11:52:08Z.wav
ハイフンとコロンを削除すると、例外はなくなりました。
リモート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;
}
rawフォルダーにあるビデオまたはオーディオファイルを再生するには:
mMediaPlayer = MediaPlayer.create(this, R.raw.a_video_or_audio_file);
mMediaPlayer.start();
mediaPlayer.create(Context、R.raw.some_resource_file)を使用するときにprepare()を呼び出す必要はありません
wmvaの代わりにmp3ファイルを再生すると修正されました。どうやらそれはAPI 19の問題ではないようです