Làm cách nào để kiểm tra thời lượng video (mp4) sử dụng shell?


16

Tôi cần phải tải lên tất cả các tệp mp4 trong một thư mục có độ dài> 4 phút bằng cách sử dụng trình bao. Tôi không thể tìm thấy bất kỳ tập lệnh nào để kiểm tra thời lượng của video. Có ai có bất cứ ý tưởng làm thế nào để làm điều đó?

Cảm ơn rât nhiều!


1
xem stackoverflow.com/questions/3844430/ trên: hy vọng điều này sẽ giúp
harish.venkat

Câu trả lời:


23

Điều này sẽ cung cấp cho bạn độ dài của một video.

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//

Cũng hoạt động cho các url video từ xa, ví dụ: ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/ Lỗi " 2> & 1 | Thời lượng grep | cắt -d '' -f 4 | sed s /, //
skidadon

Định dạng thông điệp tường trình FFmpeg có được đảm bảo không? Nếu không, tôi không thích điều này nhiều - nó có thể ngừng hoạt động với bất kỳ bản phát hành nào.
Ondra Žižka

7

Mediainfo là một công cụ nhanh chóng cho mục đích này:

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

Bạn có thể tìm thấy nhiều lựa chọn hơn trong một câu trả lời kỹ lưỡng hơn .

Trong các thử nghiệm của tôi, ffprobemất 0,3 giây và mediainfomất 0,09 giây.


Điều này mang lại kết quả kỳ lạ ... như 2679600 ... tốt hơn để sử dụng mediainfo --Inform="Video;%Duration/String%" [inputfile]... sẽ mang lại cho bạn thứ gì đó trong 43 phút 50
Robert Riedl

5

Bạn có thể thử sử dụng lệnh avconv ..

Đầu tiên bạn nên cài đặt:

Cài đặt qua trung tâm phần mềm

nếu bạn nhập lệnh bằng cờ -i, bạn sẽ nhận được thông tin về video:

avconv -i test.mp4

Trong đầu ra có một trường gọi là Thời lượng

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

Bây giờ bạn có thể sử dụng lệnh để chỉ nhận giá trị của trường Thời lượng

Kiểu:

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

Trong trường hợp của tôi, kết quả là:

00:58:28.05

58 phút và 28,05 giây.

Hy vọng điều này sẽ hữu ích!


1
Điều này cũng có thể được sử dụng với avprobe- không cần -i, nhưng nó hoạt động chính xác theo cùng một cách. Hoặc ffprobecho câu trả lời của @ per.
evilsoup

4

exiftool(ban đầu dự định đọc siêu dữ liệu máy ảnh từ các tệp hình ảnh, nhưng sau đó được mở rộng để đọc và ghi siêu dữ liệu từ hầu hết mọi loại tệp phương tiện) rất thuận tiện để sử dụng cho việc này. Chạy nó với:

exiftool FILE.mp4 | grep Duration

Có thể bạn sẽ cần cài đặt exiftooltrước, nhưng điều này được thực hiện dễ dàng bằng lệnh sau (trên Debian và các công cụ phái sinh như Ubuntu, v.v.):

apt install libimage-exiftool-perl

Tất nhiên, câu trả lời này chỉ là một lựa chọn khác. Nhiều câu trả lời khác cũng tốt :)


2

Thậm chí đơn giản hơn:

avprobe file.mp4 -show_format_entry duration

Hiện tại tôi nhận được thông báo "Tùy chọn 'show_format_entry' không được dùng nữa, sử dụng '-show_entries format = thời gian' thay vào đó"
Faheem Mitha

1

Thêm vào giải pháp Pers , điều này có thể được sử dụng trên toàn bộ thư mục:

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

nó thậm chí có thể được mở rộng bằng cách | sortsắp xếp các tệp theo chiều dài của chúng.

bạn có thể thêm nó vào .bashrchoặc .bash_aliasesđể có thể thực hiện lsvlength | sorttrên một thư mục

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'

1

ffprobelà giải pháp tao nhã hơn so với ffmpeglỗi ném nếu không được đưa ra đường dẫn đầu ra.

ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1

0

Nếu bạn muốn xem thời lượng của một số video trong một thư mục, bạn có thể sử dụng lệnh sau

exiftool * | grep ^ Thời lượng | cắt -d '' -f 26


1
Không cần sử dụng grepvà như vậy. Đơn giản exiftool -T -Duration *.mkv(hoặc bất kỳ mẫu tệp nào)
PerlDuck

0

Như bạn có thể thấy có rất nhiều cách để thực hiện điều này. ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONtrong đó mediafile là tên của tệp, sẽ cung cấp đầu ra tương tự như bên dưới. Đầu tiên là thời lượng của luồng thứ nhất (thường là video) và thứ hai cung cấp thời lượng của luồng thứ hai (thường là âm thanh)

  DURATION        : 00:21:40.132000000
  DURATION        : 00:21:40.062000000
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.