Ghost Napisano 17 Maj 2010 Zgłoś Share Napisano 17 Maj 2010 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 More sharing options...
Micz Napisano 17 Maj 2010 Zgłoś Share Napisano 17 Maj 2010 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 1 Odnośnik do komentarza Udostępnij na stronach More sharing options...
Ghost Napisano 17 Maj 2010 Autor Zgłoś Share Napisano 17 Maj 2010 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 More sharing options...
Micz Napisano 17 Maj 2010 Zgłoś Share Napisano 17 Maj 2010 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. 1 Odnośnik do komentarza Udostępnij na stronach More sharing options...
Ghost Napisano 17 Maj 2010 Autor Zgłoś Share Napisano 17 Maj 2010 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 More sharing options...
Micz Napisano 17 Maj 2010 Zgłoś Share Napisano 17 Maj 2010 Ale jeśli jakimś sposobem indeks wyjdzie Ci po za rozmiar tablicy to program na 100% się sypnie, a przynajmniej wstrzyma wykonywanie pewnych zadań. Odnośnik do komentarza Udostępnij na stronach More sharing options...
Ghost Napisano 17 Maj 2010 Autor Zgłoś Share Napisano 17 Maj 2010 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 More sharing options...
Recommended Posts