Skocz do zawartości

[Java] Obliczanie czasu pliku muzycznego


Ghost

Recommended Posts

No właśnie, potrzebuję sposobu, wskazówki, metody, czegokolwiek, co naprowadzi mnie na algorytm obliczania czasu pliku muzycznego. Format pliku *.amr. Próbowałem porównywać ze sobą czas pliku sprawdzony w playerze i wielkość plików w bajtach, no i wyszło mi z tego, że jedna sekunda to ŚREDNIO 1650 bajtów ale wychodzą z tego przekłamania rzędu 10-20 sekund. Szukam lepszej metody.

Odnośnik do komentarza
Udostępnij na stronach

A to ma być java me czy se?

Z tego co wiem Java ma wbudowaną obsługę amr, więc pewnie powinno się dać odczytać te dane przez sound api.

http://jsresources.org/faq_audio.html#file_length

Ogólnie cała ta strona jest poświęcona zagadnieniom związanym z dźwiękiem w Javie, więc myślę że tu znajdziesz odpowiedzi na wszystkie swoje pytania i nawet jakieś przykładowe fragmenty kodu.

W tym wątku masz jak przeliczyć długość utworu.

http://forums.sun.com/thread.jspa?threadID=5378623

  • Like 1
Odnośnik do komentarza
Udostępnij na stronach

Nie nie, chodzi o standardową Javę. Ogólnie programik służy do kopiowania nagranych przez telemarketerów rozmów z telefonu (dlatego amr) na zmapowany dysk sieciowy w linuxie (linux ptfu) :) Link który podałeś nie do końca pasuje, bo wywalało mi UnsuppordetFileFormatException, ale znalazłem na tej stronie coś innego:

http://jsresources.org/faq_audio.html#calculate_gsm_duration

Po drobnych korektach działa jak należy. Dla ciekawskich fragment kodu, który zlicza czas plików amr:

public String callTime(String from, int i){
     File dir = new File(from);
     File[] filesDir = dir.listFiles();
     
     long lengthOfData = filesDir[i].length();
     long numberOfFrames = lengthOfData / (325/10);
     long duration = numberOfFrames * 20;

     DateFormat df = new SimpleDateFormat("mm:ss");
     df.format(duration);

     return df.format(duration);
}

Micz masz u mnie duży browarek za te linki. Dzięki.

Odnośnik do komentarza
Udostępnij na stronach

Mówiłem, że tu na pewno znajdziesz odpowiedź :). To jest chyba największa baza wiedzy o dźwięku w Javie. Kiedyś znalazłem ten link w materiałach od Sun'a.

Powinieneś jeszcze objąć to w try catch:

public String callTime(String from, int i){
     File dir = new File(from);
     File[] filesDir = dir.listFiles();
     try {
     long lengthOfData = filesDir[i].length();
     } catch (Exception e) // nie pamiętam dokładnie Jakiego specyficznego wyjątku się w takich wypadkach używa ale z tym też zadziała
{
//tu reakcja na wyjątek na przykład zwrócenie 0 czasu, albo wyświetlenie komunikatu, zapisanie logu o błędzie itp. 
DateFormat df = new SimpleDateFormat("mm:ss");
return  return df.format(0);
}
     long numberOfFrames = lengthOfData / (325/10);
     long duration = numberOfFrames * 20;

     DateFormat df = new SimpleDateFormat("mm:ss");
     df.format(duration); // to chyba jest nie potrzebne

     return df.format(duration);
}

ewentualnie możesz dodać throws do funkcji i obsłużyć wyjątek w momencie wywołania funkcji.

  • Like 1
Odnośnik do komentarza
Udostępnij na stronach

Powinieneś jeszcze objąć to w try catch:

Pewnie tak, prawdopodobnie tak mam, bo jestem samoukiem, ale jak mi kompilator nie woła o dodanie wyjątku, to go nie dodaję :) Myślę, że nie będzie większych problemów, bo to zwykłe pobranie wielkości pliku. Przy uruchamianiu zdarzyło mi się podać złą ścieżkę do pliku i jedyne co zrobił, to napisał, że czas pliku wynosi 00:00, więc myślę, że nie wywali całego programu :)

I rzeczywiście, wolno stojące, nic nie wprowadzające do kodu df.format(duration); wcześniej znajdowało się w out.println() i jakoś ominąłem to przy usuwaniu :)

Odnośnik do komentarza
Udostępnij na stronach

No tak, o tym nie pomyślałem. W takim wypadku program się sypnie. Masz rację :) Ale jestem pewien mojego kodu, nic nie może się sypnąć, program sam pobiera ilość plików w katalogu i na tej podstawie tworzy tablicę, więc nie ma mowy o IndexOutOfBoundException... z tym walczę zawsze na początku :) Ale niech będzie, w końcu muszę wyrobić sobie dobre zwyczaje, więc umieszczę ten fragment w try catch :)

Odnośnik do komentarza
Udostępnij na stronach

Gość
Ten temat jest zamknięty i nie można dodawać odpowiedzi.
×
×
  • Dodaj nową pozycję...