2012-05-03 19 views
18

Użyłem do obliczenia czasu trwania plików MP3 po stronie serwera za pomocą ffmpeg - co wydawało się działać dobrze. Dzisiaj odkryłem, że niektóre obliczenia były błędne. Jakoś, z jakiegoś powodu, ffmpeg błędnie obliczy czas trwania i wydaje się, że dzieje się tak tylko przy plikach mp3 o zmiennej przepływności.Jak uzyskać rzeczywisty, rzeczywisty czas trwania pliku MP3 (VBR lub CBR) po stronie serwera

Podczas testowania tego na miejscu zauważyłem, że ffmpeg wydrukował dwie dodatkowe linie na zielono.

komenda używana:

ffmpeg -i song_9747c077aef8.mp3 

ffmpeg mówi:

[mp3 @ 0x102052600] max_analyze_duration 5000000 reached at 5015510 
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate 

Po ładnym, ciepłym sesji google, odkryłem kilka postów na ten temat, ale nie znaleziono rozwiązanie.

Potem próbowali zwiększyć maksymalny czas trwania:

ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3 

po tym, ffmpeg zwracane tylko drugą linię:

[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate 

Ale w obu przypadkach oblicza czas był po prostu źle. Porównując go do VLC zauważyłem, że czas jest prawidłowy.

Po kolejnych badaniach natknąłem się na mp3info - które zainstalowałem i wykorzystałem.

mp3info -p "%S" song_9747c077aef8.mp3 

mp3info następnie powrócił czas POPRAWNIE, ale tylko jako liczbę całkowitą, która nie mogę użyć jako muszę bardziej dokładny numer tutaj. Przyczyna tego została wyjaśniona w komentarzu poniżej, przez użytkownika blahdiblah - mp3info pobiera po prostu dane ID3 z pliku i nie wykonuje żadnych obliczeń.

Próbowałem również użyć mplayera do pobrania czasu trwania, ale tak jak ffmpeg, mplayer zwraca nieprawidłową wartość.

+0

http://www.id3.org/ –

+0

Dziękuję, ale nie mogę przyjąć prawidłowej informacji o czasie trwania w nagłówkach MP3/tagach ID3, nawet jeśli chciałem. Muszę to obliczyć, aby uzyskać dokładny wynik 100%. – SquareCat

+0

Ahh, to myślę, że musielibyście przejść przez mp3 i znaleźć każdą klatkę, a następnie obliczyć czas trwania z tego. –

Odpowiedz

17

W końcu znalazłem odpowiednie rozwiązanie tego problemu, używając sox - który zwraca poprawne informacje.

sox file.mp3 -n stat 
Samples read:   19321344 
Length (seconds): 219.062857 
Scaled by:   2147483647.0 
Maximum amplitude:  1.000000 
Minimum amplitude: -1.000000 
Midline amplitude: -0.000000 
Mean norm:   0.141787 
Mean amplitude:  0.000060 
RMS  amplitude:  0.191376 
Maximum delta:   0.947598 
Minimum delta:   0.000000 
Mean delta:   0.086211 
RMS  delta:   0.115971 
Rough frequency:   4253 
Volume adjustment:  1.000 

Długość (sekundy): 219,062857

+0

Jeśli potrzebujesz szybszego rozwiązania (wygląda na to, że sox odczyta wszystkie próbki z pliku) sprawdź rozwiązanie za pomocą NAudio - mono działa na Linux-ie bez problemu powinno być wykonalne ... –

+0

Wysyła 'formaty FAX sox: no handler for domyślnie rozszerzenie pliku mp3'. Jak mam go zainstalować? –

+0

http://superuser.com/questions/421153/how-to-add-a-mp3-handler-to-sox/421168 – SquareCat

5

można odkodować plik całkowicie uzyskać rzeczywisty czas trwania:

ffmpeg -i input.mp3 -f null - 

drugiego do ostatniego wiersza wyjścia konsoli pokaże coś takiego:

size=N/A time=00:03:49.12 bitrate=N/A 

Gdzie time to rzeczywisty czas trwania. W tym przykładzie cały proces trwał około 0,5 sekundy.

Powiązane problemy