Làm cách nào để trích xuất hình ảnh JPEG chất lượng tốt từ tệp video H264 với ffmpeg?


108

Hiện tại tôi đang sử dụng lệnh này để trích xuất hình ảnh:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_% 03d.jpeg

Nhưng làm cách nào để cải thiện chất lượng hình ảnh JPEG?


1
Chất lượng hiện tại có gì sai, ngoài việc nó không được "tốt"?
bjoernz

Câu trả lời:


215

Sử dụng -qscale:v

Sử dụng -qscale:v(hoặc bí danh -q:v) làm tùy chọn đầu ra. Phạm vi hiệu quả cho JPEG là 2-31 với 31 là chất lượng kém nhất. Tôi khuyên bạn nên thử các giá trị từ 2-5.

Để xuất một loạt ảnh:

ffmpeg -i input.mp4 -qscale:v 2 output_%03d.jpg

Để xuất một hình ảnh với thời lượng ~ 60 giây:

ffmpeg -ss 60 -i input.mp4 -qscale:v 4 -frames:v 1 output.jpg

Điều này sẽ hoạt động với bất kỳ đầu vào video nào. Xem bên dưới nếu đầu vào của bạn là MJPEG.


MJPEG

Nếu đầu vào của bạn là MJPEG (Motion JPEG) thì hình ảnh có thể được trích xuất mà không làm giảm chất lượng.

Đầu ra ffmpeghoặc ffprobebảng điều khiển có thể cho bạn biết đầu vào của bạn có phải là MJPEG hay không:

$ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1 input.avi
codec_name=mjpeg

Sau đó, bạn có thể trích xuất các khung bằng mjpeg2jpegbộ lọc dòng bit :

$ ffmpeg -i input.avi -codec:v copy -bsf:v mjpeg2jpeg output_%03d.jpg

Cũng thấy


Điều này dường như không có tác dụng đối với tôi - qscale 1 và 2 đều cung cấp kích thước tệp giống hệt nhau và (bằng mắt thường của tôi) xuất hiện giống như không có qscale nào cả.
felwithe

Bạn có thể đăng dòng lệnh hoàn chỉnh mà bạn đang sử dụng không? Ngoài ra, vui lòng đăng đầu ra hoàn chỉnh, chưa cắt từ ffmpeg trên dòng lệnh. Lưu ý rằng vị trí của các tùy chọn có liên quan, do đó -qscale: v 2 cần phải được đặt sau tùy chọn -i inputfile, nhưng trước tùy chọn tệp đầu ra, để có bất kỳ tác dụng nào.
Ronald S. Bultje

1
Đối với tôi thêm -qmin 1 -qmax 1ngoài việc -q:v 1tăng gấp đôi kích thước tệp. Và tôi dường như cũng có thể thấy một sự cải thiện rất nhỏ.
tổng hợp

1
@complistic: -qmin 1 -qmax 1dẫn đến tệp lớn hơn, nhưng cung cấp cho tôi một hình ảnh chính xác. Tôi đã xác nhận điều này thông qua photoshop, 2 lớp và bộ lọc khác biệt. Các điểm ảnh giống nhau.
cherouvim

@Kostanos Bạn có thể thử -qmin 1 -q:v 1.
llogan

0

Xuất hình ảnh ở định dạng không mất dữ liệu, chẳng hạn như PNG:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_%03d.png

Sau đó, sử dụng một chương trình khác (nơi bạn có thể chỉ định chính xác hơn chất lượng, lấy mẫu con và phương pháp DCT - ví dụ: GIMP) để chuyển đổi các PNG bạn muốn sang JPEG.

Theo cách này, có thể thu được hình ảnh sắc nét hơn một chút ở định dạng JPEG so với cách có thể -qmin 1 -q:v 1và xuất ra dưới dạng JPEG trực tiếp từ đó ffmpeg.


ffmpegxuất ra PNG8các tệp chỉ sử dụng 256 màu (giống như GIF). vì vậy nó thực sự rất mất mát.
lapin

@lapin Các PNG mà tôi trích xuất bằng phương pháp này là 24 bit (ngay cả đối với các khung có ít hơn 256 màu, mặc dù các khung khác có nhiều màu hơn). Điều này đang sử dụng phiên bản 4.2.1 x64 trên Windows. Cũng được viết ở đây là: "Nếu tôi kéo png từ mp4, với ffmpeglệnh [ ] này, tôi sẽ nhận được png chất lượng cao có chất lượng giống với video gốc." Bạn ffmpegđang sử dụng phiên bản nào để xuất PNG8tệp ra và định dạng đầu vào của bạn là gì?
Jake

Trên thực tế, tôi nghĩ bạn đúng, vấn đề là identify image.pngđưa ra kết quả "8-bit" trong khi thực sự nó không thực sự là 8-bit kênh đơn, mà là 8-bit cho R, G và B. IDK, identifyngười dùng bình thường phải hiểu như thế nào mà tho.
lapin
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.