Bagaimana cara memeriksa berapa lama video (mp4) menggunakan shell?

16

Saya perlu mengunggah semua file mp4 dalam direktori dengan panjang> 4 menit menggunakan shell. Saya tidak dapat menemukan skrip untuk memeriksa berapa lama video. Adakah yang tahu cara melakukannya?

Terima kasih banyak!

Thomas
sumber
1
lihat ini stackoverflow.com/questions/3844430/... :-) semoga ini membantu
harish.venkat

Jawaban:

23

Ini akan memberi Anda panjang video.

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
per
sumber
Juga berfungsi untuk url video jarak jauh misalnya ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/... " 2> & 1 | grep Durasi | cut -d '' -f 4 | sed s /, //
skidadon
Apakah format pesan log FFmpeg dijamin? Jika tidak, saya tidak suka ini - itu bisa berhenti bekerja dengan rilis apa pun.
Ondra Žižka
7

Mediainfo adalah alat cepat untuk tujuan ini:

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

Anda dapat menemukan lebih banyak opsi dalam jawaban yang lebih menyeluruh .

Dalam pengujian saya, ffprobedibutuhkan 0,3 detik dan mediainfo0,09 detik.

qubodup
sumber
Ini memberikan hasil yang aneh ... seperti 2679600 ... lebih baik digunakan mediainfo --Inform="Video;%Duration/String%" [inputfile]... yang akan membuat Anda mendapatkan sesuatu seperti 43 menit 50
Robert Riedl
5

Anda dapat mencoba menggunakan perintah avconv ..

Pertama, Anda harus menginstal:

Instal melalui pusat perangkat lunak

jika Anda mengetik perintah dengan flag -i, Anda akan mendapatkan informasi tentang video:

avconv -i test.mp4

Dalam output ada bidang yang disebut Durasi

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

Sekarang Anda bisa menggunakan perintah untuk hanya mendapatkan nilai Durasi bidang

Tipe:

avconv -i file.mp4 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//

Dalam kasus saya hasilnya adalah:

00:58:28.05

58 Menit dan 28,05 detik.

Semoga ini bisa membantu!

Raguet Romawi
sumber
1
Ini juga dapat digunakan dengan avprobe- tidak perlu untuk -i, tetapi jika tidak berfungsi dengan cara yang sama persis. Atau ffprobeuntuk jawaban @ per.
evilsoup
4

exiftool(awalnya ditujukan untuk membaca metadata kamera dari file gambar, tetapi kemudian diperluas untuk membaca dan menulis metadata dari hampir semua jenis file media) sangat mudah digunakan untuk ini. Jalankan dengan:

exiftool FILE.mp4 | grep Duration

Anda mungkin harus menginstal exiftoolterlebih dahulu, tetapi ini mudah dilakukan dengan perintah berikut (pada Debian dan turunannya seperti Ubuntu dll.):

apt install libimage-exiftool-perl

Tentu saja, jawaban ini hanyalah alternatif lain. Banyak jawaban lain juga bagus. :)

zrajm
sumber
2

Lebih sederhana:

avprobe file.mp4 -show_format_entry duration
Joan Albert Silvestre
sumber
Saat ini saya mendapatkan pesan "Opsi 'show_format_entry' sudah tidak digunakan lagi, gunakan '-show_entries format = durasi' sebagai gantinya"
Faheem Mitha
1

Menambahkan ke solusi pers , ini dapat digunakan di seluruh direktori:

for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done

bahkan dapat diperpanjang dengan | sortmembuat file diurutkan berdasarkan panjangnya.

Anda dapat menambahkan ini ke .bashrcatau .bash_aliasesagar dapat dilakukan lsvlength | sortpada direktori

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
sumber
1

ffprobeadalah solusi ffmpegyang lebih elegan daripada yang melempar kesalahan jika tidak diberi jalur output.

ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1
Ondra Žižka
sumber
0

Jika Anda ingin melihat durasi beberapa video dalam direktori, Anda dapat menggunakan perintah berikut

exiftool * | grep ^ Durasi | cut -d '' -f 26

meisamhakimi
sumber
1
Tidak perlu digunakan grepdan semacamnya. Cukup exiftool -T -Duration *.mkv(atau apa pun pola file)
PerlDuck
0

Seperti yang Anda lihat ada banyak cara untuk mencapai ini. ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONdi mana mediafile adalah nama file, akan memberikan output yang mirip dengan di bawah ini. Yang pertama adalah durasi streaming pertama (biasanya video) dan yang kedua memberikan durasi streaming kedua (biasanya audio)

  DURATION        : 00:21:40.132000000
  DURATION        : 00:21:40.062000000
Penatua Geek
sumber