2011-01-17 64 views
11

Benim app ses klipleri oynatmak için SoundPool kullanıyorum. Her şey yolunda ama klip oynatmanın ne zaman biteceğini bilmem gerek. Ben MediaPlayer örneği kullanarak her klibin süresini alarak benim onu ​​uygulamada izlemek andaAndroid'de ses dosyası süresinin en iyi yolu nedir?

. Bu iyi çalışıyor ama sadece dosya almak için her dosyayı iki kez yüklemek için savurgan görünüyor. Kabaca kendim (AssetFileDescriptor temin edilebilir) dosyasının uzunluğunu bilerek süresini hesaplamak olabilir ama yine de örnek hızını ve kanal sayısını bilmek gerekir istiyorum.

ben bu sorunun iki olası çözümleri bakın:

  1. bir klip oynatılması bittiğinde (SoundClip ile mümkün görünmemektedir) bulmaktan.
  2. Bir ses dosyasının sadece başlığını yüklemek ve (ideal, örnek sayısı tam süre almak ve) Bana kanalların örnek oranı/numarayı verebilir bir sınıf olması.

Herhangi bir öneriniz var mı?

sayesinde Max

kod Şu anda kullanarak (çalışıyor ama amaç için oldukça ağırdır) ediyorum:

Yan not
String[] fileNames = ... 
MediaPlayer mp = new MediaPlayer(); 
for (String fileName : fileNames) { 
    AssetFileDescriptor d = context.getAssets().openFd(fileName); 
    mp.reset(); 
    mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); 
    mp.prepare(); 
    int duration = mp.getDuration(); 
    // ... 
} 

, bu soru zaten olmuştur asked ama yanıtları yok.

+0

bir 'onCompletitionListener' kabul var saniyeler içinde dahili depolama ses dosyası süresini alınır? https://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html#onCompletion%28android.media.MediaPlayer%29 – sschrass

+0

@SatelliteSD basitçe hiçbir cihazına (denilen olsun asla) çalışmıyor Sahibim. Bazı işletim sistemi sürümleri/bazı cihazlarda çağrılsa bile güvenilmez ve bu nedenle işe yaramaz. – Gilead

+1

"setOnCompletitionListner" ifadesinin '.start()' den sonra çağrıldığını gördün mü? – sschrass

cevap

9

Bunu denedin mi:

String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath(); 
MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
mmr.setDataSource(mediaPath); 
String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
mmr.release(); 

Ama bu kodu Var olan daha hafif olduğundan tam olarak emin değilim.

+3

'MediaMetadataRetriever' –

+0

'u yayımlamayı unutmayın, ancak her zaman bir mmS.NaviSource() 'dan bir IllegalArgumentException atıldım - bu yolun nasıl görünmesi gerektiğini bulmanın bir yolu var mı? Çünkü kullandığım yolun yanlış olabileceğinden şüpheleniyorum. Paket içi .m4a ve/veya .wav ses dosyalarını kullanıyorum. – Jonny

+1

@Meher mükemmel cevap +1 –

3

FFmpegMediaMetadataRetriever deneyin:

String[] fileNames = ... 
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever(); 

for (String fileName : fileNames) { 
    AssetFileDescriptor d = context.getAssets().openFd(fileName); 
    mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); 
    String duration = mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION); 
} 

mmr.release(); 
0

bu beni

MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
AssetFileDescriptor d = context.getAssets().openFd(fileName); 
mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); 
String duration = 
mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
mmr.release(); 

> ===== toplam saniyede varlıklar ses dosyası süresini olsun Güncelleme için iştir

Varlık ses dosyası du almak için

yöntemi saniye

public String gettotaltimeassets() { 

    MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
    AssetFileDescriptor d = null; 
    try { 
     d = getApplicationContext().getAssets().openFd("ASSETS FILE NAME"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); 
    String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    long dur = Long.parseLong(duration); 
    String seconds = String.valueOf((dur % 60000)/1000); 
    Log.d("seconds===========>", seconds); 
    mmr.release(); 
    return seconds; 
} 

yöntemi rasyon

public String gettotaltimestorage(String filePath) { 
    // load data file 
    Log.d("time=================>","time=================>"); 
    MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
    metaRetriever.setDataSource(YourACTIVITY.this, Uri.parse(filePath)); 
    Log.d("time=================>","time=================>"); 
    String out = ""; 
    // get mp3 info 

    // convert duration to minute:seconds 
    String duration = 
      metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    Log.d("time=================>", duration); 
    long dur = Long.parseLong(duration); 
    String seconds = String.valueOf((dur % 60000)/1000); 
    Log.d("seconds===========>", seconds); 
    // close object 
    metaRetriever.release(); 
    return seconds; 

} 
+0

Lütfen cevabınızı açıklayınız. Bu sadece mevcut sorunun nedenini anlamaya değil, aynı zamanda gelecekte de kaçınmaya yardımcı olacaktır. –

+0

aslında aslında @William Seemann yazmak gibi varlıklarda herhangi bir ses dosyasının süresini almak için kod yazarım ama süresi almak için MediaMetadata kullanıyorum ... daha iyi anlayabilmem için cevabımı değiştiriyorum ... birden fazla ses dosyası için bu yöntemi çağırabilirsiniz süresi olsun. –

+0

Bu yorumu siz yazmadınız, çünkü kodunuzu anlayamadım, fakat doğru bir açıklama ile çözümünüze eşlik etmek için SO üzerinde iyi bir uygulama. Kod-Sadece cevaplar çok takdir edilmez. –