Odpowiedzi:
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
\n
aby wydrukować również nową linię. > mp3info -p "%S\n" sample.mp3
// całkowity czas w sekundach
ffmpeg
wypisze wszystko, co wie o pliku, jeśli nie podasz żadnych innych argumentów. Użyj, grep
aby 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
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 $TOTLENGTH
wydrukowanie 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.)
Estimating duration from bitrate, this may be inaccurate
. Myślę, że ta odpowiedź jest poprawna tylko w przypadku Constant Bitrate MP3.
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)
Zastosowane rozwiązania ffmpeg
wydają 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.
ffmpeg
zawiera narzędzie ffprobe
do 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'
ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
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
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/,//
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! ;)