Uzyskaj długość MP3 w systemie Linux / FreeBSD

27

Mam kilka plików mp3 o różnej długości. Chcę go zmniejszyć do 50% -60% długości. Mówi, od 1 minuty do 30 sekund. Używanie ffmpeg powinno być trywialne. Ale nie wiem, jak określić jego pierwotną długość jako podstawę do przetwarzania przy użyciu ffmpeg.

Czy ktoś ma pomysł?

ariefbayu
źródło

Odpowiedzi:

31

Z ffmpeg nie ma możliwości, aby uzyskać długość jako zmienną, której można użyć w skrypcie. Ale mp3info ma.

mp3info -p "%S" sample.mp3   // total time in seconds
Krasnolud
źródło
tak, nie ma możliwości uzyskania informacji o długości w ffmpeg. Powiedziałem już, że używam ffmpeg dopiero po uzyskaniu długości. W każdym razie dzięki za głowy.
ariefbayu
4
Warto zauważyć, że podaje to tylko liczbę całkowitą. Dlatego może nie być wystarczająco dokładny w niektórych przypadkach użycia.
Ross
Najlepsza odpowiedź, ponieważ działa nawet ze średnią lub zmienną szybkością transmisji bitów MP3!
KrisWebDev
1
Dodaj, \naby wydrukować również nową linię. > mp3info -p "%S\n" sample.mp3 // całkowity czas w sekundach
nexayq 16.04.17
22

ffmpegwypisze wszystko, co wie o pliku, jeśli nie podasz żadnych innych argumentów. Użyj, grepaby usunąć wszystko oprócz „Czas trwania”:

$ ffmpeg -i foo.mp3 2>&1 | grep Duration
  Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s

Możesz także użyć mplayer. Grep dla linii „ID_LENGTH =”:

$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
quack quixote
źródło
3
$ ffmpeg -i foo.mp3 2> i 1 | awk '/ Duration / {print substr (2,0 $, length (2 $) -1)}' For just the time time
Craig Tataryn
Aby zsumować długość zestawu plików MP3, możesz użyć czegoś takiego jak TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTHwydrukowanie całkowitej długości dźwięku we wszystkich plikach, w kilka sekund. Prawdopodobnie można to zrobić bardziej wydajnie, ale ponieważ napisałem to jako jednorazowe, było wystarczająco dobre dla moich potrzeb. (Drugie wywołanie awk usuwa dziesiętne, więc wynik nie jest w 100% dokładny, ale znowu wystarczająco dobry dla moich potrzeb.)
CV
Uważaj na flagę -analyzeduration ffmpeg. Zasadniczo liczby, które zgłasza, są szacunkowe po pewnym punkcie w celu zaoszczędzenia procesora.
mlissner
Korzystając ze średniej szybkości transmisji bitów MP3, ffmpeg zgłasza niepoprawny czas trwania wraz z ostrzeżeniem Estimating duration from bitrate, this may be inaccurate. Myślę, że ta odpowiedź jest poprawna tylko w przypadku Constant Bitrate MP3.
KrisWebDev
9

Co ciekawe, aplikacja EXIFTool podaje czas trwania MP3 jako ostatnią linię!

$ exiftool somefile.mp3
Numer wersji ExifTool: 7.98
Nazwa pliku: somefile.mp3
Katalog:.
Rozmiar pliku: 49 MB
Data / godzina modyfikacji pliku: 2009: 09: 10 11: 04: 54 + 05: 30
Typ pliku: MP3
Typ MIME: audio / mpeg
Wersja MPEG Audio: 2.5
Warstwa audio: 3
Szybkość transmisji audio: 64000
Częstotliwość próbkowania: 8000
Tryb kanału: pojedynczy kanał
MS Stereo: Wył
Intensywność stereo: Wył
Flaga praw autorskich: False
Oryginalne media: prawda
Nacisk: brak
Rozmiar ID3: 26
Gatunek: blues
Czas trwania: 1:47:46 (około)
nik
źródło
3

Po prostu inny sposób, aby uzyskać czas trwania tylko za pomocą ffmpegi grep:

# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12
FC
źródło
2

Zastosowane rozwiązania ffmpegwydają mi się nieco delikatne, ponieważ analizują dane wyjściowe, które nie są zaprojektowane jako interfejs. Mimo to prawdopodobnie nadal będą pracować przez kilka lat.

ffmpegzawiera narzędzie ffprobedo uzyskiwania informacji o plikach audio (wiele formatów, w tym mp3) i może generować dane wyjściowe do odczytu maszynowego. Następujące polecenie pobiera czas trwania utworu.

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
Att Righ
źródło
2
Możesz po prostu zrobićffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan
1

Osobiście używam Mplayera do wydobywania informacji, głównie dlatego, że już go zainstalowałem i nie mogę niepokoić się niepotrzebną instalacją nowego oprogramowania. Zaletą tego jest to, że nie ogranicza się on w szczególności do plików mp3 i powinien działać z każdym plikiem multimedialnym, który Mplayer może obsłużyć. Następująca linijka zwróci długość ścieżki w sekundach.

mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
goldPseudo
źródło
1

Możesz użyć ffmpeg, aby uzyskać czas trwania pliku. Po prostu użyj:

ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
Monica Sol
źródło
0

Miałem ten sam problem i stwierdziłem, że polecenie mplayer (goldPseudo) działa dobrze, ale później odkryłem, że jeśli otworzysz album w RhythmBox, zobaczysz, że jego linia stanu podaje liczbę ścieżek, całkowity czas odtwarzania i rozmiar płyty.

AFH
źródło
-1

Oto moje proste użycie powyższego.

mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15

Przesyłam tę wartość do zmiennej mp3_full_length

mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`



# I can use this variable for my own purpose!
echo $mp3_full_length 
10:47:15

Dziękuję ponad ludzi! Korzystam z twoich pomysłów i wiedzy Dziękujemy za przeczytanie, miłego dnia! ;)

Jeongpyo Lee
źródło