Làm cách nào tôi có thể nhận được độ dài của tệp video từ bảng điều khiển?


24

Giả sử chúng ta có một tập tin video một số video.

Làm cách nào tôi có thể nhận được độ dài của nó từ tập lệnh shell (với mplayer / transcode / gstreamer / vlc / ffmpeg / anything)?

VIDEO_LENGTH_IN_SECONDS=`ffmpeg .... -i some_video ... | grep -o .....`

Câu trả lời:


33
ffprobe -i some_video -show_entries format=duration -v quiet -of csv="p=0"

sẽ trả về thời lượng video tính bằng giây.


Không biết về ffprobe , cảm ơn!
ckujau

21

Một cái gì đó tương tự như:

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

Điều này sẽ cung cấp : HH:MM:SS.ms. Bạn cũng có thể sử dụng ffprobe, được cung cấp với hầu hết các cài đặt FFmpeg:

ffprobe -show_format input | sed -n '/duration/s/.*=//p'

… hoặc là:

ffprobe -show_format input | grep duration | sed 's/.*=//')

Để chuyển đổi thành giây (và giữ lại mili giây), đặt ống vào:

awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }'

Để chuyển đổi nó thành mili giây, đường ống thành:

awk '{ split($1, A, ":"); print 3600000*A[1] + 60000*A[2] + 1000*A[3] }'

Nếu bạn muốn chỉ vài giây mà không cần mili giây, hãy chuyển sang:

awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'

Thí dụ:

nhập mô tả hình ảnh ở đây


Ngoài ra tcprobe được mong muốn cho nó, nhưng nó không hoạt động tốt trên hệ thống của tôi.
Vi.

1
... Bản chỉnh sửa của tôi đã bị từ chối, vì vậy tôi sẽ đăng ở đây rằng bước đầu tiên có thể được thực hiện chính xác hơn ffprobe, một công cụ được thiết kế cho chính xác các loại mục đích được đóng gói với ffmpeg: ffprobe -show_format input | sed -n '/duration/s/.*=//p'(hoặc ffprobe -show_format input | grep duration | sed 's/.*=//'). Có lẽ @slhck có thể chỉnh sửa điều này thành câu trả lời.
evilsoup

Xin lỗi về điều đó, @evilsoup. Có lẽ tôi nên từ chối trách nhiệm rằng bạn và LordNeckbeard được phép tự do chỉnh sửa các bài đăng của tôi. Tôi đã gặp vấn đề này vài lần rồi. Lần tới chỉ cần thêm một ghi chú nhỏ vào tin nhắn chỉnh sửa hoặc hơn thế :)
slhck

0

Trong trường hợp bạn không có quyền truy cập ffprobe, bạn có thể sử dụng mediainfo.

# Outputs a decimal number in seconds
mediainfo some_video --Output=JSON | jq '.media.track[0].Duration' | tr -d '"'`

1
Loại bỏ sự cần thiết jqtr:mediainfo --Output="General;%Duration/String%" input
llogan

Khéo léo! Bây giờ tôi sẽ để lại câu trả lời của mình chưa được chỉnh sửa vì đầu ra của lệnh của bạn có dạng X s YYY msso với X.YYY. Đủ dễ dàng để điều chỉnh | sed -e 's/ s /./' -e 's/ ms//'nếu bạn muốn đi theo tuyến đường đó và không có quyền truy cập jq.
ToBeReploped

Điều đó có thể được thay đổi với mediainfo --Output="General;%Duration/String3%" inputđầu ra 00:01:48.501thay vì 1 min 48 s.
llogan
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.