Ich habe folgenden Code:
AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
Das Problem ist, dass beim Ausführen dieses Codes alle Audiodateien im Assets-Verzeichnis in alphabetischer Reihenfolge abgespielt werden, anstatt nur die angeforderte Audiodatei abzuspielen. Was mache ich falsch? Gibt es eine bessere Möglichkeit, Audiodateien aus dem Assets-Verzeichnis abzuspielen?
Folgefrage: Gibt es einen Unterschied zwischen dem Speichern von Audiodateien im Assets-Verzeichnis und dem Speichern im Res/Raw-Verzeichnis? Abgesehen davon, dass sie keine IDs erhalten, wenn sie sich im Assets-Verzeichnis befinden. Wenn ich die Audiodateien in den Ordner res/raw verschiebe, habe ich ein Problem mit der Wiederverwendung von MediaPlayer
s, da für setDataSource()
kein Parameter id vorhanden ist. Ich kann keine gute Richtlinie für den Umgang mit dieser Art von Problem finden.
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
Ihre Version würde funktionieren, wenn Sie nur eine Datei in den Assets hätten Verzeichnis. Der Inhalt des Asset-Verzeichnisses besteht nicht aus "echten Dateien" auf der Festplatte. Alle werden nacheinander zusammengefügt. Wenn ja. Wenn Sie nicht angeben, wo Sie beginnen sollen und wie viele Bytes gelesen werden sollen, wird der Player bis zum Ende lesen (dh alle Dateien werden im Assets -Verzeichnis wiedergegeben)
Diese Funktion wird richtig funktionieren :)
// 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();
}
}
Hier meine statische Version:
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();
}
}
Korrektur der obigen Funktion für Wiedergabe und Pause
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 ();
}
}