Một ffmpeg lót (hoặc khác) để chỉ có độ phân giải?


9

Tôi thực sự không rành về dòng lệnh nên hy vọng điều này không quá ngu ngốc đối với một câu hỏi.

Nếu tôi chạy:

ffmpeg -i videofile.avi

Tôi nhận được một đầu ra như thế này:

ffmpeg version git-2013-11-21-6a7980e Copyright (c) 2000-2013 the FFmpeg develop    ers
  built on Nov 21 2013 12:06:32 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --prefix=/home/user/ffmpeg_build --extra-cflags=-I/home/user/ffmpeg_build/include --extra-ldflags=-L/home/user/ffmpeg_build/lib --b        indir=/home/user/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable    -libfdk-    aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-l    ibx264 --enable-    nonfree
  libavutil      52. 53.100 / 52. 53.100
  libavcodec     55. 44.100 / 55. 44.100
  libavformat    55. 21.100 / 55. 21.100
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 91.100 /  3. 91.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from 'videofile.avi':
  Metadata:
    encoder         : Lavf52.68.0
  Duration: 00:23:07.68, start: 0.000000, bitrate: 2390 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480     [SAR 1:1 DAR 4:3], 23.98 fps, 23.98 tbr, 23.98 tbn, 1199 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 128 k    b/s

Nếu tôi chỉ quan tâm đến lệnh xuất ra "640x480", làm thế nào tôi có thể làm điều đó?

Tôi tưởng tượng tôi phải dẫn đầu ra và thực hiện một biểu thức chính quy? Không biết làm thế nào để làm điều đó. Cảm ơn!

Câu trả lời:


10

Nhận độ phân giải video với ffmpeg:

ffmpeg -i filename 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+'

Đầu ra (ví dụ):

640x480

Câu trả lời của muru chắc chắn là quá đủ, nhưng câu trả lời này đặc biệt trả lời câu hỏi của tôi khi được hỏi (ví dụ: sử dụng ffmpeg). Tôi không biết giao thức ở đây là gì khi chọn câu trả lời. Trong trường hợp này, tôi nghĩ câu trả lời của Muru hữu ích hơn trong khi Cyrus thì đúng hơn. Xin lỗi, không biết phải đi bằng cách nào nhưng ngay bây giờ tôi đang chọn Cyrus 'vì nó rất cụ thể những gì tôi đã yêu cầu (nhưng tôi đang sử dụng lol của Muru)
bcsteeve 24/1/2015

1
Hãy cẩn thận. Ví dụ hiển thị trong câu hỏi sẽ dẫn đến grep tạo ra hai kết quả khớp (lần đầu tiên 0x44...và lần thứ hai là độ phân giải).
muru

Nếu đầu vào chứa nhiều luồng video, chẳng hạn như đầu vào từ DVD, thì câu trả lời này sẽ xuất ra một width x heightluồng video trên nhiều dòng. Điều này có thể tránh được nếu muốn với ffprobehoặc bằng cách thêm head -n 1vào lệnh trong câu trả lời.
llogan


4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

làm công việc mà không có bất kỳ greps

Một lớp lót trông như:

exiftool -b metavideo.mp4 -ImageSize

Điều đó trả về chuỗi WxH mà bạn đang tìm kiếm.


Đây không phải là kỹ thuật một lót.
David Foerster

Tôi đã không nhận thấy rằng đó là một lớp lót được yêu cầu, dù sao cũng thực hiện cùng một tham số -ImageSize trả về chuỗi WxH.
Alex Dolgov

Nhìn vào tiêu đề của câu hỏi một lần nữa! ;-) Dù sao +1
David Foerster

3

Tôi chỉ thấy ở đây các mẫu sử dụng exiftoolvà phân tích cú pháp đầu ra của nó, dường như là một lựa chọn kỳ lạ. exiftoolcó thể được sử dụng theo cách trực tiếp để có được độ phân giải (và hầu hết mọi siêu dữ liệu khác):

exiftool -ImageSize -s3 filename

Sẽ dẫn đến kết quả đầu ra dưới dạng WIDTHxHEIGHT(eq 1280×720:)

LƯU Ý: -s3hướng dẫn exiftool tạo ra định dạng đầu ra ngắn nhất (không có tên thẻ, dấu ngoặc kép, v.v.)


2

Bạn có thể làm điều này bằng cách sử dụng các biểu thức thông thường và ffmpeg, nhưng tôi muốn sử dụng exiftoolmột phần của gói libimage-exiftool-perlCài đặt libimage-exiftool-perl :

$ exiftool some/video.ogv | awk -F' *: *' '$1 == "Image Size"{print $2}'
1242x480

Tại sao exiftool?

  • Các ffmpeg/ avprobetiện ích in dòng dạng Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480nơi một hoặc nhiều giá trị của các hình thức AAAxBBBcó thể xảy ra (như bạn có thể thấy trong ví dụ của bạn). Xác định cái nào là độ phân giải có thể khó khăn.
  • exiftoolmặt khác, xuất dữ liệu của biểu mẫu Type : Value. Vì vậy, dễ dàng hơn để có được các lĩnh vực chính xác, cụ thể là Image Size. Ngoài ra, theo cách các trường được chỉ định (phân tách bằng dấu hai chấm và khoảng trắng), bạn có thể dễ dàng trích xuất giá trị.

Những gì awklệnh làm là:

  • Đặt dấu phân cách trường thành ' *: *'- dấu hai chấm được :bao quanh bởi bất kỳ số khoảng trắng nào.
  • Kiểm tra xem trường đầu tiên ( $1) làImage Size
  • Và in trường thứ hai ( print $2).

Một phiên bản thay thế sẽ là:

awk '/^Image Size/{print $4}'
  • Theo mặc định, awk sử dụng khoảng trắng để phân chia các lĩnh vực, vì vậy Image, Size, :1242x480là tất cả các lĩnh vực khác nhau.
  • Bằng cách khớp dòng bắt đầu ( ^) với dòng Image Size, chúng ta có được dòng chính xác.
  • Và chúng tôi in các lĩnh vực thứ tư (kể từ Image, Size:là ba lĩnh vực đầu tiên).

Cảm ơn! Tôi có thể đề nghị bạn chỉnh sửa ví dụ của mình để thay đổi "Ubuntu_Free_CARM_Showcase / How \ fast.ogg" thành một cái gì đó chung chung hơn. Lúc đầu, tôi sử dụng nó theo nghĩa đen bởi vì tôi không nhận ra nó là tên tệp. Tất nhiên, tôi đã thấy lỗi của mình 2 giây sau và giải pháp của bạn hoạt động rất tốt!
bcsteeve

@bcsteeve Tôi đã sử dụng nó vì đó là một phần của nội dung ví dụ được cài đặt trong máy tính để bàn Ubuntu (xem /usr/share/example). : D
muru

1

Việc sử dụng hơi bí truyềnmediainfo sẽ dễ dàng trích xuất chiều rộng và chiều cao theo định dạng mà bạn đang có sau khi sử dụng một lớp lót đơn giản. Quan sát ví dụ sau trên hệ thống của tôi:

andrew@illium~$ mediainfo --Inform="Video;%Width%x%Height%" test.mp4
1920x1080

Các thông số khác có thể được sử dụng theo cách này có thể được nhìn thấy mediainfo --Info-Parametersnhưng có lẽ chính cách sử dụng đơn giản này sẽ đủ cho bạn ...


0

Tôi đã thực hiện một forvòng lặp 1 để trích xuất độ phân giải từ thư mục của các tập tin.

for i in $(ls "/root/vidz/dollabillz/"*); do eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "$i"); size=${streams_stream_0_width}x${streams_stream_0_height}; echo $i $size; done;

3
Phân tích cú pháp lssẽ không kết thúc tốt ... trích dẫn sẽ không sửa chữa mớ hỗn độn
Zanna

vẫn chưa làm tôi thất vọng sau 100.000 lần mã hóa
Kevin Dollabillz
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.