Muszę ftp przesłać wszystkie pliki mp4 w katalogu o długości> 4 minut za pomocą powłoki. Nie mogę znaleźć żadnego skryptu, który mógłby sprawdzić długość filmu. Czy ktoś ma jakiś pomysł, jak to zrobić?
Dziękuję Ci bardzo!
Muszę ftp przesłać wszystkie pliki mp4 w katalogu o długości> 4 minut za pomocą powłoki. Nie mogę znaleźć żadnego skryptu, który mógłby sprawdzić długość filmu. Czy ktoś ma jakiś pomysł, jak to zrobić?
Dziękuję Ci bardzo!
Odpowiedzi:
To da ci długość filmu.
ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
Mediainfo to szybkie narzędzie do tego celu:
$ mediainfo --Inform="Video;%Duration%" [inputfile]
Więcej opcji znajdziesz w dokładniejszej odpowiedzi .
W moich testach ffprobe
zajmuje 0,3 sekundy i mediainfo
0,09 sekundy.
mediainfo --Inform="Video;%Duration/String%" [inputfile]
... co dałoby ci coś, np. 43 min 50s
Możesz spróbować użyć polecenia avconv ..
Najpierw powinieneś zainstalować:
jeśli wpiszesz polecenie z flagą -i, otrzymasz informacje o filmie:
avconv -i test.mp4
W danych wyjściowych znajduje się pole o nazwie Czas trwania
avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
built on Nov 6 2012 16:51:33 with gcc 4.6.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Duration: 00:58:28.05, start: 0.000000, bitrate: 888 kb/s
Stream #0.0(eng): Video: h264 (High), yuv420p, 720x404, 748 kb/s, 25 fps, 25 tbr, 20k tbn, 50 tbc
Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s
Teraz możesz użyć polecenia, aby uzyskać tylko wartość pola Czas trwania
Rodzaj:
avconv -i file.mp4 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//
W moim przypadku wynikiem jest:
00:58:28.05
58 minut i 28,05 sekundy.
Mam nadzieję, że to pomoże!
avprobe
- nie ma takiej potrzeby -i
, ale poza tym działa dokładnie w ten sam sposób. Lub ffprobe
dla odpowiedzi @ per.
exiftool
(pierwotnie przeznaczony do odczytu metadanych aparatu z plików obrazów, ale później rozszerzony do odczytu i zapisu metadanych z prawie każdego rodzaju pliku multimedialnego) jest do tego bardzo wygodny w użyciu. Uruchom z:
exiftool FILE.mp4 | grep Duration
exiftool
Najpierw prawdopodobnie będziesz musiał zainstalować , ale można to łatwo zrobić za pomocą następującego polecenia (w Debianie i pochodnych takich jak Ubuntu itp.):
apt install libimage-exiftool-perl
Oczywiście ta odpowiedź jest kolejną alternatywą. Wiele innych odpowiedzi jest również dobrych. :)
Jeszcze prościej:
avprobe file.mp4 -show_format_entry duration
Dodanie do rozwiązania pers może być wykorzystane w całym katalogu:
for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,// | tr -d "\n" && echo " $f"; done
można go nawet rozszerzyć o | sort
sortowanie plików według ich długości.
możesz dodać to do .bashrc
lub .bash_aliases
, aby móc to zrobić lsvlength | sort
w katalogu
alias lsvlength='for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,// | tr -d "\n" && echo " $f"; done'
ffprobe
jest bardziej eleganckim rozwiązaniem, niż ffmpeg
które generuje błąd, jeśli nie podano ścieżki wyjściowej.
ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1
Jeśli chcesz zobaczyć czas trwania niektórych filmów w katalogu, możesz użyć następującego polecenia
exiftool * | grep ^ Czas trwania | cut -d '-f 26
grep
i takie. Po prostu exiftool -T -Duration *.mkv
(lub jakikolwiek wzorzec pliku)
Jak widać, istnieje wiele sposobów osiągnięcia tego celu.
ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATION
gdzie mediafile to nazwa pliku, zapewni dane wyjściowe podobne do poniższych. Pierwszy to czas trwania pierwszego strumienia (zazwyczaj wideo), a drugi to czas trwania drugiego strumienia (zazwyczaj audio)
DURATION : 00:21:40.132000000
DURATION : 00:21:40.062000000