मैं ffmpeg के साथ H264 वीडियो फ़ाइल से अच्छी गुणवत्ता वाली JPEG छवि कैसे निकाल सकता हूं?


108

वर्तमान में मैं छवियों को निकालने के लिए इस कमांड का उपयोग कर रहा हूं:

ffmpeg.exe -i 10fps.h264 -r 10f -f image2 10fps.h264_% 03.1.ppeg

लेकिन मैं जेपीईजी छवि गुणवत्ता कैसे सुधार सकता हूं?


1
वर्तमान गुणवत्ता में क्या गलत है, इसके अलावा यह "अच्छा" नहीं है?

जवाबों:


215

उपयोग -qscale:v

उपयोग -qscale:vया उपनाम-q:vआउटपुट विकल्प के रूप में ) का । जेपीईजी के लिए प्रभावी रेंज 2-31 है जिसमें 31 सबसे खराब गुणवत्ता के हैं। मैं 2-5 मूल्यों की कोशिश कर रहा हूँ।

छवियों की एक श्रृंखला का उत्पादन करने के लिए:

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

~ 60 सेकंड की अवधि में एकल छवि का उत्पादन करने के लिए:

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

यह किसी भी वीडियो इनपुट के साथ काम करेगा। नीचे देखें कि क्या आपका इनपुट MJPEG है।


MJPEG

यदि आपका इनपुट MJPEG (मोशन जेपीईजी) है तो छवियों को बिना किसी गुणवत्ता हानि के निकाला जा सकता है।

ffmpegया ffprobeकंसोल आउटपुट आपको बताती हैं कि अपने इनपुट MJPEG है कर सकते हैं:

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

फिर आप mjpeg2jpegबिटस्ट्रीम फ़िल्टर का उपयोग करके फ़्रेम निकाल सकते हैं :

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

और देखें


यह मेरे लिए कोई प्रभाव नहीं लगता है - qscale 1 और 2 दोनों समान फ़ाइल आकार देते हैं और (मेरी नग्न आंखों के लिए) बिल्कुल बिना qscale के समान दिखाई देते हैं।
felwithe

क्या आप पूरी कमांडलाइन का उपयोग कर रहे हैं? कृपया कमांडलाइन पर ffmpeg से पूर्ण, बिना काट-छाँट के आउटपुट पोस्ट करें। ध्यान दें कि विकल्पों की नियुक्ति प्रासंगिक है, इसलिए -qscale: v 2 को -i इनपुटफाइल विकल्प के बाद रखा जाना चाहिए, लेकिन आउटपुट फ़ाइल विकल्प से पहले, किसी भी प्रभाव के लिए।
रोनाल्ड एस। बल्टजे

1
मेरे लिए फ़ाइल का आकार दोगुना -qmin 1 -qmax 1करने के अलावा जोड़ना -q:v 1। और मैं बहुत मामूली सुधार भी देख सकता हूं।
शिकायतकर्ता

1
@complistic: -qmin 1 -qmax 1बड़ी फ़ाइल के परिणामस्वरूप, लेकिन मुझे एक समान छवि मिलती है। मैंने इसे फोटोशॉप, 2 लेयर्स और डिफरेंट फिल्टर के जरिए वेरिफाई किया। पिक्सेल समान हैं।
चेरोविम

@ कोस्टानोस आप कोशिश कर सकते हैं -qmin 1 -q:v 1
लेलगन

0

छवियों को पीएनजी जैसे दोषरहित प्रारूप में आउटपुट करें:

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

फिर एक और प्रोग्राम का उपयोग करें (जहां आप गुणवत्ता को सही तरीके से निर्दिष्ट कर सकते हैं, सबमप्लिमेंटिंग और डीसीटी विधि - जैसे जीआईएमपी) पीएनजी को जेपीईजी में बदलना चाहते हैं।

जेपीईजी प्रारूप में इस तरह से थोड़ा तेज चित्र प्राप्त करना संभव है -qmin 1 -q:v 1और जेपीईजी से सीधे आउटपुट के साथ संभव है ffmpeg


ffmpegआउटपुट PNG8फ़ाइलें जो केवल 256 रंगों का उपयोग करती हैं (जीआईएफ के समान)। इसलिए यह वास्तव में बहुत नुकसानदेह है।
लैपिन

इस विधि का उपयोग करके निकाले गए PNLs @lapin 24 बिट हैं (यहां तक ​​कि 256 से कम रंगों वाले फ्रेम के लिए, हालांकि अन्य के पास बहुत अधिक हैं)। यह विंडोज पर संस्करण 4.2.1 x64 का उपयोग कर रहा था। यहाँ भी लिखा है: "अगर मैं एक mp4 से png को खींचता हूं, तो इस [ ffmpeg] कमांड के साथ, मुझे उच्च गुणवत्ता वाले png मिलते हैं जो मूल वीडियो के समान गुणवत्ता के हैं।" आप किस संस्करण का ffmpegउपयोग कर रहे हैं जो PNG8फ़ाइलों को आउटपुट कर रहा है, और आपका इनपुट प्रारूप क्या है?
जेक

वास्तव में मुझे लगता है कि आप सही हैं, समस्या यह थी कि identify image.png"8-बिट" परिणाम देता है जब वास्तव में इसका एकल चैनल 8-बिट नहीं होता है, लेकिन R, G और B. IDK के लिए 8-बिट औसत identifyउपयोगकर्ता को कैसे समझा जाता है वह थो।
लैपिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.