web-dev-qa-db-ja.com

MediaPlayer.setDataSource(String)がローカルファイルで機能しない

静的メソッドMediaPlayer.create(context、id)を使用するとローカルmp3を再生できますが、非静的メソッドMediaPlayer.setDataSource(String)を使用すると機能しません。何が起こっているのかと言うと、MediaPlayer.prepare()を呼び出すと同期例外が発生します。

prepare exceptionjava.io.IOException: Prepare failed.: status=0x1

ここに私のコードがあります(ログの省略):

String filename = "Android.resource://" + this.getPackageName() + "/raw/test0";

mp = new MediaPlayer();
try { mp.setDataSource(filename); } catch (Exception e) {}
try { mp.prepare(); } catch (Exception e) {}
mp.start();

ファイルが見つからないなどのエラーが表示されないことに注意してください。ファイルのフルネームはtest0.mp3で、Eclipseの/ res/raw /ディレクトリに配置します。

パスを間違って設定していると思いますが、オンラインで見つけたすべての例では、setDataPathのStringバージョンではなく、setDataPathのFileDescriptorバージョンを使用しています。

編集:MediaPlayer.setDataSource(FileDescriptor)メソッドを使用してEclipseの/ assets /ディレクトリにファイルを配置すると、ローカルmp3を再生することもできます。

編集2:これは不可能だという答えを受け入れましたが、使用しているライブラリ(openFrameworks)が実際にStringメソッドを使用してファイルをロードしていることに気付きました。こちらをご覧ください:

https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxAndroid/ofAndroidLib/src/cc/openframeworks/OFAndroidSoundPlayer.Java

27
user755921

Android documentation のように

生の形式で保存する任意のファイル。これらのリソースを未加工のInputStreamで開くには、R.raw.filenameというリソースIDでResources.openRawResource()を呼び出します。

ただし、元のファイル名とファイル階層にアクセスする必要がある場合は、res/raw /ではなく、assets /ディレクトリにリソースを保存することを検討してください。 asset /内のファイルにはリソースIDが与えられていないため、AssetManagerを使用した場合にのみ読み取ることができます。

そのため、メディアプレーヤーに設定する前に、InputStreamを使用してオーディオファイルを読み取る必要があります。

あなたが言ったように、オーディオファイルをアセットフォルダに入れることをお勧めします

:)

3
DeKoServidoni

私のために働いているコードの下に、このコードがあなたを助けると思います

    player = MediaPlayer.create(this,R.raw.test0);
    player.setLooping(true); // Set looping

    player.setVolume(100,100);
    player.start();

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
player.stop();
player.release();
}
2
Ravi Vaghela

生のリソースを扱うときは、次のコンストラクタに依存する必要があります。

public static MediaPlayercreate(コンテキストコンテキスト、int resid)

指定されたリソースIDのMediaPlayerを作成する便利なメソッド。成功すると、prepare()はすでに呼び出されているため、再度呼び出すことはできません。

コードは次のようになります

_mediaPlayer = MediaPlayer.create(this, R.raw.test0);
mediaPlayer.start();
_

終了したら、mediaPlayer.release()を呼び出すことを忘れないでください。

ソース

2
Sebastiano

here から

パスがローカルファイルを参照する場合、ファイルは実際には呼び出し側アプリケーション以外のプロセスによって開かれる場合があります。これは、パス名が絶対パスでなければならず(他のプロセスが未指定の現在の作業ディレクトリで実行されるように)、パス名が誰でも読み取り可能なファイルを参照する必要があることを意味します。 別の方法として、アプリケーションは最初にファイルを読み取り用に開いてから、setDataSource(FileDescriptor)形式のファイル記述子を使用できます。

試して、

String filePath = "path/file.mp3";
File file = new File(filePath);
FileInputStream inputStream = new FileInputStream(file);
mediaPlayer.setDataSource(inputStream.getFD());
inputStream.close();

それが役に立てば幸い!

1
Akhunzaada

setDataSource(@NonNull Context context, @NonNull Uri uri)の代わりにsetDataSource(String path)を使用する必要があります

リソースの内部アプリケーションリソースを解決するため、このようなものを解決するために使用されるContextを提供する必要があります

また、これら2つのメソッドの内部を見ると、結果のリソースを見つけるために異なる戦略を使用していることに気付くでしょう。

0
Dmitry