कैसे एक वीडियो में ffmpeg के लिए एक jpg छवि अनुक्रम सांकेतिक शब्दों में बदलना करने के लिए?


21

मेरे पास jpgs का एक बड़ा सेट है जिसे मैं एक वीडियो को दोषरहित रूप से परिवर्तित करना चाहता हूं (या, बहुत कम से कम, दोषरहित रूप से बहुत करीब जब तक कि एन्कोडिंग समय अन्यथा की तुलना में बहुत अधिक नहीं है)।

Naively, मुझे लगता है कि कुछ ऐसे कोडेक होने चाहिए जो प्रत्येक व्यक्ति के jpg फ्रेम्स को स्टोर कर सकते हैं, जैसे कि (पुनर्संयोजन के बिना), और शायद पिछले फ्रेम से डेल्टा की जानकारी द्वारा कुछ फ़्रेमों को बदलकर कुछ अच्छा संपीड़न प्राप्त करें। मेरे मामले में तख्ते के कई क्रम हैं जो एक दूसरे के समान हैं, या जिनके बीच थोड़ा अंतर है।

Ffmpeg के लिए कुछ कोडेक और उपयुक्त सेटिंग्स हैं जो इसे प्राप्त कर सकती हैं?




1
अनुक्रम के jpegs एक लंबा समय के लिए एक codec किया गया है। डिजिटल कैमरा जो h.264 का उपयोग हमेशा के लिए रिकॉर्ड नहीं करते हैं MJPEG, और वीडियो कैप्चर कार्ड इसका इस्तेमाल करते थे, मुझे लगता है।
पीटर कॉर्डेस

जवाबों:


24

बस छवियों को mux

आप बस एक वीडियो बनाने के लिए JPG छवियों को mux कर सकते हैं:

ffmpeg -framerate 30 -i input%03d.jpg -codec copy output.mkv

ध्यान दें कि यदि आप छोड़ देते हैं -framerateतो -framerate 25इनपुट पर डिफ़ॉल्ट रूप से लागू किया जाएगा।

दोषरहित अनुकूलन

आप jpegtranप्रत्येक फ्रेम पर दोषरहित अनुकूलन करने के लिए उपयोग कर सकते हैं जो महत्वपूर्ण फ़ाइल आकार बचत प्रदान कर सकता है :

mkdir outputdir
for f in *.jpg; do jpegtran -optimize -copy none -perfect -v "$f" > "outputdir/$f"; done

अब ffmpegजैसा कि ऊपर दिखाया गया है।

यह जाँचना कि यह वास्तव में दोषरहित है

Framehash म्युक्सर प्रत्येक फ्रेम के अद्वितीय हैश की तुलना करने के लिए सुनिश्चित करें कि परिणाम सही मायने में नष्ट नहीं होता है इस्तेमाल किया जा सकता:

$ ffmpeg -i input%03d.jpg -f framehash -
stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash
0,          0,          0,        1,   460800, 29bcc2db3726c7dfec1826c5740f603f
0,          1,          1,        1,   460800, b5fdc23d93cbd043dc2b9290dc8378f0
0,          2,          2,        1,   460800, ee0709942f24b458fd2380d134dcb59d
...

$ ffmpeg -i output.mkv -map 0:v -f framehash -
stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash
0,          0,          0,        1,   460800, 29bcc2db3726c7dfec1826c5740f603f
0,          1,          1,        1,   460800, b5fdc23d93cbd043dc2b9290dc8378f0
0,          2,          2,        1,   460800, ee0709942f24b458fd2380d134dcb59d
...

उपरोक्त उदाहरणों में इनपुट और आउटपुट के लिए प्रत्येक संबद्ध फ्रेम यह सुनिश्चित करता है कि फ्रेम समान हो और आउटपुट दोषरहित हो।

और देखें


क्या आप कृपया स्पष्ट कर सकते framemd5हैं कि केवल आदेशों को सूचीबद्ध करने से परे दो आदेशों को क्या हासिल करना चाहिए? जब समान फ्रेम की पहचान की जाती है तो मुझे अतिरिक्त संपीड़न कैसे मिलेगा?
जीजे

1
हैश को केवल आपको यह दिखाने के लिए शामिल किया गया था कि फ्रेम व्यक्तिगत छवियों के समान हैं, इसलिए इसलिए "प्रत्येक व्यक्ति के jpg फ्रेम के रूप में (बिना पुनर्मिलन के)" स्टोर करने की आपकी आवश्यकता को प्राप्त करना।
ललगन

डुप्लिकेट फ़्रेमों को छोड़ने के लिए एक अप्रयुक्त विचार के साथ अपने स्वयं के उत्तर को पोस्ट किया, एक VFR MJPEG.mkv के साथ समाप्त करने के लिए। वीएफआर एकमात्र तरीका है जो मैं एमजेपीईजी के साथ अस्थायी अतिरेक का लाभ उठाने के बारे में सोच सकता हूं। : पी
पीटर कॉर्ड्स

निष्ठा की तुलना करने के लिए SSIM एक तेज तरीका हो सकता है।
ज्ञान

11

यह एक दोषरहित एच .264 वीडियो का उत्पादन करेगा जहां फ्रेम अन्य फ्रेम से जानकारी का उपयोग करेगा

ffmpeg -f image2 -r 30 -i %09d.jpg -vcodec libx264 -profile:v high444 -refs 16 -crf 0 -preset ultrafast a.mp4

विकल्पों की व्याख्या:

  • -f image2 - छवियों के एक समूह का चयन करने के लिए ffmpeg बताता है
  • -r 30 - ffmpeg को प्रति सेकंड 30 फ्रेम (या चित्र) पर एनकोड करने के लिए कहता है (इसे अपने इच्छित फ्रेमरेट में बदलें)
  • -i %09d.jpg- ffmpeg को इनपुट के रूप में छवियों को 000000000.jpg से 999999999.jpg पर उपयोग करने के लिए कहता है। बदले 9में %09d.jpgकितने शून्य अपनी छवि अनुक्रम के नाम है करने के लिए। यदि आपकी फ़ाइल के नाम हैं, उदाहरण के लिए, img0001.jpg, तो इसे img% 04d.jpg के रूप में व्यक्त किया जाएगा।
  • -vcodec libx264 - ffmpeg को H.264 कंप्लेंट फाइल के आउटपुट के लिए कहता है
  • -profile:v high444 - उच्च 4: 4: 4 भविष्यवाणी दोषरहित प्रोफ़ाइल का उपयोग करने के लिए libx264 बताता है, जो दोषरहित एन्कोडिंग की अनुमति देता है
  • -refs 16 - libx264 को 16 छवियों को एक बफर में संग्रहीत करने के लिए कहता है, ताकि उन्हें वीडियो में अन्य छवियों द्वारा संदर्भित किया जा सके
  • -crf 0 - दोषरहित एनकोड करने के लिए libx264 बताता है
  • -preset ultrafast - libx264 आउटपुट फ़ाइल आकार पर एन्कोडिंग गति को प्राथमिकता देने के लिए कहता है
  • a.mp4- af.mp4 नामक एक MP4 फ़ाइल में आउटपुट को बचाने के लिए ffmpeg को बताता है। इसे फ़ाइल नाम और प्रारूप में बदलें जिसे आप उपयोग करना चाहते हैं

3
कुछ नोट: -f image2यहाँ बहुत ही अच्छा है। इसके बजाय छवि फ़ाइल डेमो का उपयोग करना चाहिए । libx264 स्वचालित रूप से उचित चयन करेंगे दोषरहित के लिए, और के साथ सौदा होगा । -framerate-r-profile-preset-refs
ललगन

-refs 5MOST पर, जब तक आप नहीं जानते कि आपकी सामग्री में कई अन्य लोगों द्वारा अलग-अलग छवियां हैं, जो डुप्लिकेट होने से पहले संदर्भ को खोने के लिए x264 का कारण हो सकता है। की तुलना में अधिक ultrafastबनाता है थोड़ा दोषरहित मोड में अलग, CABAC के ~ 10% (बिटरेट दोषरहित के लिए आवश्यक में एक उच्च CPU लागत के लिए) CAVLC से अधिक लाभ के अलावा अन्य। गंभीरता से, कुछ लाइव-एक्शन 720x480p60 ( superfastडीनडल आउटपुट) पर, 28GB slowerथा , 27GB था। यदि सांकेतिक शब्दों में बदलना समय मायने नहीं रखता है, लेकिन डिकोड समय करता है, सुनिश्चित करें कि आप CABAC से बचें। शायद भी -tune fastdecode। मॉडरेट रेफरी की गिनती को चोट नहीं पहुंचनी चाहिए।
पीटर कॉर्डेस

और अगर आपके पास जलने के लिए सीपीयू है, तो आप -preset placeboप्रतिशत के कुछ अतिरिक्त अंशों के लिए भी प्रयास कर सकते हैं ।
युकां

इसके अलावा पूर्णता के लिए h265 का अपना दोषरहित मोड भी है। -vcodec libx265 -x265-params lossless=1बराबर विकल्प है। (लेकिन मेरे अनुभव में (= पावरपॉइंट स्लाइड शो प्रस्तुतियों की रिकॉर्डिंग), यह जरूरी बेहतर नहीं है, और यह h264 की तुलना में बहुत धीमा है) अगले साल के लिए AOMedia की AV1 / IETF की NETVC1 / Xiph की Daala / जो भी इसके द्वारा नाम बदलने जा रही है। ... की दोषरहित मोड
DrYak

5

आप छवियों aviकी एक श्रृंखला के रूप में एक एनीमेशन बना सकते हैं png( png यह दोषरहित है ताकि jpeg => pngरूपांतरण आपकी तस्वीरों को नीचा न करे):

अगर आपकी छवियों का नाम है img_0001.jpg

ffmpeg -r 25 -start_number 1 -f image2 -i "img_%04d.jpg" -vcodec png video.avi

जहां "25" परिणामी वीडियो में इच्छित फ्रेम दर है। -start_numberयदि यह 1 है, तो इसकी आवश्यकता नहीं है, लेकिन यदि आपका पहला वीडियो नंबर 1 नहीं है तो यह उपयोगी है।

यदि आप mjpegउच्चतम गुणवत्ता कमांड लाइन के साथ सांकेतिक शब्दों में बदलना चाहते हैं :

ffmpeg -r 25 -start_number 1 -f image2 -i "img_%04d.jpg" -vcodec mjpeg -qscale 1 video.avi

और बात की सुंदरता यह है कि आप वीडियो को श्रृंखला में वापस तस्वीरों में बदल सकते हैं:

ffmpeg -i video.avi "img_series_%04d.png"
ffmpeg -i video.avi "img_series_%04d.jpg"

आदि...


यह वास्तव में पूछने वालों की जरूरतों को पूरा नहीं करता है। वह एक ऐसा रास्ता खोज रहा है, जिसमें फ्रेम को केवल छवि बदलने पर ही अपडेट किया जा सके। इसका मतलब है कि एक ही छवि को एक से अधिक बार उपयोग किया जा सकता है। प्रकृति द्वारा jpeg दोषरहित नहीं है क्योंकि मेरा मानना ​​है कि यह अधिकतम गुणवत्ता पर भी jpeg संपीड़न का उपयोग करता है।
ए जे हेंडरसन

वास्तव में मुझे लगता है कि वह कुछ कम्प्रेशन करने को तैयार था, हालाँकि मुझे यकीन नहीं है कि यह एक ही फ्रेम के लंबे दृश्यों पर कैसे होगा। मुझे अभी भी लगता है कि एक वैरिएबल फ्रेम रेट प्रेजेंटेशन फॉर्मेट है, जो कि ज़रूरी है, हालांकि मुझे यकीन नहीं है कि अगर ffmpeg किसी का समर्थन करता है।
ए जे हेंडरसन

CorePNG P फ्रेम भी बनाने में सक्षम है। आमतौर पर jpeg दोषरहित संपीड़न नहीं है, और मुझे संदेह है कि mjpeg P फ्रेम बना सकता है। मैं मानता हूं कि मैं इस सवाल का जवाब नहीं देता क्योंकि यह पूछा जाता है, लेकिन मैं एफएफएमईजी के साथ दोषरहित वीडियो का समाधान देता हूं।
ओलिवियर एस

4

लॉर्डनेकबर्ड के उत्तर पर विस्तार करने के लिए, हां, जेपीईजी डेटा को एमजेपीईजी वीडियो स्ट्रीम में mux करें। यह आउटपुट इमेज के सटीक अनुक्रम का सबसे छोटा प्रतिनिधित्व होगा, भले ही MJPEG आज के मानकों के लिए एक बहुत ही अयोग्य है। (कोई लौकिक अतिरेक नहीं, और कोई इंट्रा भविष्यवाणी भी नहीं।

आप अपने इनपुट में डुप्लिकेट छवियों का लाभ लेने के लिए एक वैरिएबल-फ्रामर्ट MJPEG वीडियो बना सकते हैं।

ffmpeg -framerate 30 -i input%03d.jpg -vf mpdecimate -codec copy output.mkv  # doesn't work.

Hrm, यह काम नहीं कर रहा है, क्योंकि mpdecimate संकुचित डेटा पर काम नहीं करेगा, और हम ffmpeg को डिकोड नहीं कर सकते हैं और फिर नुकसान और CPU लागत के बिना छवि डेटा को फिर से jpeg कर सकते हैं।

हो सकता है कि यदि आपने उस अनुक्रम संख्या, या कुछ और के साथ डुप्लिकेट jpg स्रोत फ़ाइलों को खाली फ़ाइलों के साथ बदल दिया?

चूँकि यह प्रश्न अभी हाल का नहीं है, इसलिए मैं यह जानने में समय नहीं लगा रहा हूँ कि यह कैसे किया जाए जब तक कि कोई पूछने के लिए उत्तर न दे। लेकिन जब से MJPEG एक mkv कंटेनर में जा सकता है, मुझे यकीन है कि एक फाइल होना संभव है जो दोहराया फ्रेम के लिए jpeg डेटा को डुप्लिकेट नहीं करता है, लेकिन इसके बजाय डुप्लिकेट के अनुक्रम तक डिकोड करने के लिए आउटपुट फ्रेम नहीं है। ऊपर।

ओह यहाँ एक विचार है:

ffmpeg -framerate blah -input blah -vf mpdecimate -f mkvtimestamp_v2 mpdecimate.timestamps

फिर निकालें (या एक तरफ ले जाएँ) सभी फ़्रेमों के लिए जेपेग्स, जिसे mpdecimate ड्रॉप करना चाहता है (शायद उसके पास कुछ लॉगिंग ऑप्शन हैं? या -vf showinfo, और पार्स करें, और उसके आउटपुट में केवल वही फ़्रेम ले जाएँ या हार्डलिंक करें, जो पीछे छूट जाए। गिरा JPEGs?)। MJPEG.mkv के लिए mux, फिर उस टाइमस्टैम्प से फ्रेम टाइमस्टैम्प को बदलने के लिए mkvmerge के साथ कुछ करें mpdecimate.timestamps

यदि आप MJPEG के लिए सिर्फ jux data को muxing करने के बजाय xcoding कर रहे थे, तो यह बहुत आसान होगा, क्योंकि आप mpdecimate और इसके अलावा किसी भी कोडेक के साथ मेरे पहले कमांड का उपयोग copyकरेंगे, और यह सिर्फ काम करेगा (tm)।

मैंने इसमें से कोई भी कोशिश नहीं की है, क्योंकि यह एक पुराना सवाल था। यह भी कारण है कि मैं कैसे वास्तव में mpdecimate उत्पादन के आधार पर jpegs की अपनी निर्देशिका को फ़िल्टर करने के लिए, या वास्तव में टाइमस्टैम्प धारा का उपयोग कैसे करें के अंतराल में नहीं भरा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.