2013-03-13 12 views
11

Ich habe eine Voice Recorder App erstellt, und ich möchte die Dauer der Aufnahmen in einem Listenansicht zeigen. Ich speichere die Aufnahmen so:Dauer der Audiodatei

Wie kann ich die Dauer in Sekunden dieser Datei erhalten?

Vielen Dank im Voraus

--- EDIT Ich habe es funktioniert, rief ich MediaPlayer.getduration() innerhalb der MediaPlayer.setOnPreparedListener() -Methode so 0.

Antwort

0

zurückgegeben Nachdem Sie die Datei schreiben , öffne es in einem MediaPlayer und rufe getDuration darauf auf.

+0

dass versucht, aber es gibt immer 0 aus irgendeinem Grund – Simon

+1

Egal, ich habe es funktioniert! Ich habe MediaPlayer.getDuration() in der MediaPlayer.setOnPreparedListener-Methode aufgerufen und gibt 0 zurück 0 – Simon

10

Ausprobieren Verwenden

long totalDuration = mediaPlayer.getDuration(); // to get total duration in milliseconds 

long currentDuration = mediaPlayer.getCurrentPosition(); // to Gets the current playback position in milliseconds 

Abteilung auf 1000 bis Sekunden zu konvertieren.

Hoffe das hat dir geholfen.

+1

MediaPlayer.getduration() gibt 0 aus irgendeinem merkwürdigen Grund zurück, wissen Sie warum? – Simon

19

Entweder versuchen Dauer in Millisekunden zu erhalten:

MediaPlayer mp = MediaPlayer.create(yourActivity, Uri.parse(pathofyourrecording)); 
int duration = mp.getDuration(); 

Oder die Zeit von recorder.start() bis recorder.stop() in Nanosekunden vergangen messen:

long startTime = System.nanoTime();  
// ... do recording ...  
long estimatedTime = System.nanoTime() - startTime; 
+0

die erste gibt 0 zurück und wenn ich die zweite Lösung verwenden möchte, muss ich die Datei abspielen und ich will das nicht – Simon

+0

Sie müssen nicht die Datei für die zweite spielen. Sie legen startTime fest, wenn der Benutzer mit der Aufzeichnung beginnt, und berechnen die geschätzte Zeit, wenn der Benutzer die Aufzeichnung beendet. Für die erste Option stellen Sie sicher, dass Sie Ihren MediaRecorder freigeben, bevor Sie den MediaPlayer initialisieren. Wenn es immer noch 0 zurückgibt, liegt wahrscheinlich ein Fehler vor. Ich würde verschiedene Audioformate ausprobieren. – Erol

+0

Diese Lösung funktioniert auf einigen Geräten, aber nicht auf anderen. Irgendeine Idee warum? Arbeitet am Nexus5, aber nicht am Hudl. Könnten es unterstützte Medientypen sein? Die Datei, die ich versuche zu lesen, ist ein h264 mp4. – speedynomads

1

Haben Sie bei Ringdroid geschaut?. Es ist ziemlich leicht und die Integration ist einfach. Es funktioniert auch gut mit VBR-Mediendateien.

Für Ihr Problem mit der Dauer, möchten Sie vielleicht etwas wie unten mit Ringdroid tun.

public class AudioUtils 
{ 
    public static long getDuration(CheapSoundFile cheapSoundFile) 
    { 
     if(cheapSoundFile == null) 
      return -1; 
     int sampleRate = cheapSoundFile.getSampleRate(); 
     int samplesPerFrame = cheapSoundFile.getSamplesPerFrame(); 
     int frames = cheapSoundFile.getNumFrames(); 
     cheapSoundFile = null; 
     return 1000 * (frames * samplesPerFrame)/sampleRate; 
    } 

    public static long getDuration(String mediaPath) 
    { 
     if(mediaPath != null && mediaPath.length() > 0) 
      try 
      { 
       return getDuration(CheapSoundFile.create(mediaPath, null)); 
      }catch (FileNotFoundException e){} 
      catch (IOException e){} 
     return -1; 
    } 
} 

Hoffnung, die

39

MediaMetadataRetriever hilft, ist eine leichte und effiziente Art und Weise, dies zu tun. MediaPlayer ist zu schwer und konnte Leistungsproblem im Bereich der Hochleistungs-Umgebung wie Scrollen, Paging, Notierung usw.

Des Weiteren entstehen, Error (100,0) auf MediaPlayer passieren könnte, da es eine schwer ist und manchmal braucht Neustart immer wieder durchgeführt werden.

Uri uri = Uri.parse(pathStr); 
MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
mmr.setDataSource(AppContext.getAppContext(),uri); 
String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
int millSecond = Integer.parseInt(durationStr); 
+0

Das war nett zu finden, da es anscheinend einen Fehler in MediaPlayer.getDuration() gibt - zumindest für mp4. Vielen Dank! –

+0

Wie bekomme ich MediaMetadataCompat.METADATA_KEY_DURATION? –

3

Der schnellste Weg ist über MediaMetadataRetriever. Allerdings gibt es ein Fang

wenn Sie URI und Kontext verwenden Datenquelle einstellen können Sie Fehler https://code.google.com/p/android/issues/detail?id=35794

Lösung absoluten Pfad der Datei-Metadaten von Mediendatei abgerufen wird verwenden begegnen.

Unten ist der Code-Schnipsel, so zu tun

private static String getDuration(File file) { 
       MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); 
       mediaMetadataRetriever.setDataSource(file.getAbsolutePath()); 
       String durationStr = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
       return Utils.formateMilliSeccond(Long.parseLong(durationStr)); 
      } 

Jetzt können Sie Millisekunde für Menschen lesbaren Format entweder von unten Formate konvertieren mit

 /** 
     * Function to convert milliseconds time to 
     * Timer Format 
     * Hours:Minutes:Seconds 
     */ 
     public static String formateMilliSeccond(long milliseconds) { 
      String finalTimerString = ""; 
      String secondsString = ""; 

      // Convert total duration into time 
      int hours = (int) (milliseconds/(1000 * 60 * 60)); 
      int minutes = (int) (milliseconds % (1000 * 60 * 60))/(1000 * 60); 
      int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60)/1000); 

      // Add hours if there 
      if (hours > 0) { 
       finalTimerString = hours + ":"; 
      } 

      // Prepending 0 to seconds if it is one digit 
      if (seconds < 10) { 
       secondsString = "0" + seconds; 
      } else { 
       secondsString = "" + seconds; 
      } 

      finalTimerString = finalTimerString + minutes + ":" + secondsString; 

    //  return String.format("%02d Min, %02d Sec", 
    //    TimeUnit.MILLISECONDS.toMinutes(milliseconds), 
    //    TimeUnit.MILLISECONDS.toSeconds(milliseconds) - 
    //      TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds))); 

      // return timer string 
      return finalTimerString; 
     }