Jak sprawdzić, jak długo wideo (MP4) używa powłoki?

16

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!

Tomasz
źródło
1
zobacz to stackoverflow.com/questions/3844430/… :-) mam nadzieję, że to pomoże
harish.venkat

Odpowiedzi:

23

To da ci długość filmu.

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
za
źródło
Działa także dla zdalnych adresów URL wideo, np. Ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/… " 2> & 1 | grep Czas trwania | cut -d '' -f 4 | sed s /, //
skidadon 16.10.17
Czy format komunikatów dziennika FFmpeg jest gwarantowany? Jeśli nie, nie bardzo mi się to podoba - może przestać działać z każdym wydaniem.
Ondra Žižka
7

Mediainfo to szybkie narzędzie do tego celu:

$ mediainfo --Inform="Video;%Duration%"  [inputfile]

Więcej opcji znajdziesz w dokładniejszej odpowiedzi .

W moich testach ffprobezajmuje 0,3 sekundy i mediainfo0,09 sekundy.

qubodup
źródło
Daje to dziwne wyniki ... jak 2679600 ... lepiej użyć mediainfo --Inform="Video;%Duration/String%" [inputfile]... co dałoby ci coś, np. 43 min 50s
Robert Riedl
5

Możesz spróbować użyć polecenia avconv ..

Najpierw powinieneś zainstalować:

Zainstaluj za pośrednictwem centrum oprogramowania

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!

Roman Raguet
źródło
1
Można tego również użyć z avprobe- nie ma takiej potrzeby -i, ale poza tym działa dokładnie w ten sam sposób. Lub ffprobedla odpowiedzi @ per.
evilsoup
4

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

exiftoolNajpierw 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. :)

zrajm
źródło
2

Jeszcze prościej:

avprobe file.mp4 -show_format_entry duration
Joan Albert Silvestre
źródło
Obecnie pojawia się komunikat „Opcja” Pokaż_format_wysyłka ”jest przestarzała, zamiast tego należy użyć opcji„ -show_entries format = duration ””
Faheem Mitha,
1

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 | sortsortowanie plików według ich długości.

możesz dodać to do .bashrclub .bash_aliases, aby móc to zrobić lsvlength | sortw 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'
mcnesium
źródło
1

ffprobejest bardziej eleganckim rozwiązaniem, niż ffmpegktó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
Ondra Žižka
źródło
0

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

meisamhakimi
źródło
1
Nie ma potrzeby korzystania grepi takie. Po prostu exiftool -T -Duration *.mkv(lub jakikolwiek wzorzec pliku)
PerlDuck
0

Jak widać, istnieje wiele sposobów osiągnięcia tego celu. ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONgdzie 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
Starszy Geek
źródło