私は次のコードを持っています:
AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
問題は、このコードを実行すると、要求したオーディオファイルを再生するだけでなく、アセットディレクトリ内のすべてのオーディオファイルをアルファベット順に再生し始めることです。私は何を間違えていますか?アセットディレクトリからオーディオファイルを再生するより良い方法はありますか?
追加の質問:アセットディレクトリにオーディオファイルを保持することとres/rawディレクトリに保持することには違いがありますか?それらがassetsディレクトリにある場合、IDを取得しないという事実に加えて。オーディオファイルをres/rawフォルダーに移動すると、setDataSource()
のidパラメーターがないため、MediaPlayer
sの再利用に問題があります。この種の問題を処理するための良いガイドラインが見つかりません。
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
アセットディレクトリにファイルが1つしかない場合、バージョンは機能します。アセットディレクトリの内容は、実際にはディスク上の「実際のファイル」ではありません。それらはすべて次々にまとめられます。したがって、開始する場所と読み取るバイト数を指定しない場合、プレーヤーは最後まで読み取ります(つまり、assetsディレクトリ内のすべてのファイルを再生し続けます)
この関数は適切に動作します:)
// MediaPlayer m; /*assume, somewhere in the global scope...*/
public void playBeep() {
try {
if (m.isPlaying()) {
m.stop();
m.release();
m = new MediaPlayer();
}
AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3");
m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
descriptor.close();
m.prepare();
m.setVolume(1f, 1f);
m.setLooping(true);
m.start();
} catch (Exception e) {
e.printStackTrace();
}
}
ここに私の静的バージョン:
public static void playAssetSound(Context context, String soundFileName) {
try {
MediaPlayer mediaPlayer = new MediaPlayer();
AssetFileDescriptor descriptor = context.getAssets().openFd(soundFileName);
mediaPlayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
descriptor.close();
mediaPlayer.prepare();
mediaPlayer.setVolume(1f, 1f);
mediaPlayer.setLooping(false);
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
再生と一時停止に関する上記の機能の修正
public void playBeep ( String Word )
{
try
{
if ( ( m == null ) )
{
m = new MediaPlayer ();
}
else if( m != null&&lastPlayed.equalsIgnoreCase (Word)){
m.stop();
m.release ();
m=null;
lastPlayed="";
return;
}else if(m != null){
m.release ();
m = new MediaPlayer ();
}
lastPlayed=Word;
AssetFileDescriptor descriptor = context.getAssets ().openFd ( "rings/" + Word + ".mp3" );
long start = descriptor.getStartOffset ();
long end = descriptor.getLength ();
// get title
// songTitle=songsList.get(songIndex).get("songTitle");
// set the data source
try
{
m.setDataSource ( descriptor.getFileDescriptor (), start, end );
}
catch ( Exception e )
{
Log.e ( "MUSIC SERVICE", "Error setting data source", e );
}
m.prepare ();
m.setVolume ( 1f, 1f );
// m.setLooping(true);
m.start ();
}
catch ( Exception e )
{
e.printStackTrace ();
}
}