सवाल मैं उचित गुणवत्ता के साथ ffmpeg का उपयोग कर एक वीडियो को GIF में कैसे परिवर्तित करूं?


मैं बदल रहा हूँ FLV फिल्म टू GIF ffmpeg के साथ फ़ाइल करें।

ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000  output.gif

यह बहुत अच्छा काम करता है, लेकिन आउटपुट gif फ़ाइल में बहुत कम गुणवत्ता है।

कोई विचार मैं परिवर्तित gif की गुणवत्ता में सुधार कैसे कर सकता हूं?

आदेश का आउटपुट:

ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000  output.gif
ffmpeg version 0.8.5-6:0.8.5-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers
  built on Jan 24 2013 14:52:53 with gcc 4.7.2
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.flv':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-02-14 04:00:07
  Duration: 00:00:18.85, start: 0.000000, bitrate: 3098 kb/s
    Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 2905 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 192 kb/s
    Metadata:
      creation_time   : 2013-02-14 04:00:07
[buffer @ 0x92a8ea0] w:1280 h:720 pixfmt:yuv420p
[scale @ 0x9215100] w:1280 h:720 fmt:yuv420p -> w:320 h:240 fmt:rgb24 flags:0x4
Output #0, gif, to 'output.gif':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-02-14 04:00:07
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame=  101 fps= 32 q=0.0 Lsize=    8686kB time=10.10 bitrate=7045.0kbits/s dup=0 drop=149    
video:22725kB audio:0kB global headers:0kB muxing overhead -61.778676%

धन्यवाद।


257
2018-02-22 20:06


मूल




जवाब:


ffmpeg अब उच्च गुणवत्ता वाले जीआईएफ आउटपुट कर सकते हैं। यदि आप पुराने निर्माण पर विचार कर रहे हैं हाल ही में स्थिर निर्माण डाउनलोड करना या संकलन ffmpeg

ffmpeg उदाहरण

gif with ffmpeg
203k

यह उदाहरण इनपुट के पहले 30 सेकंड को छोड़ देगा और 3 सेकंड आउटपुट बनाएगा। यह उत्पादन को 320 पिक्सल चौड़ा होने के लिए स्केल करेगा और पहलू अनुपात को संरक्षित करते समय स्वचालित रूप से ऊंचाई निर्धारित करेगा। palettegen तथा paletteuse फ़िल्टर आपके स्रोत से उत्पन्न कस्टम पैलेट उत्पन्न और उपयोग करेंगे।

  1. एक पैलेट उत्पन्न करें:

    ffmpeg -y -ss 30 -t 3 -i input.flv \
    -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png
    
  2. पैलेट का उपयोग कर जीआईएफ आउटपुट करें:

    ffmpeg -ss 30 -t 3 -i input.flv -i palette.png -filter_complex \
    "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif
    

देख एफएफएमपीईजी के साथ उच्च गुणवत्ता वाले जीआईएफ कई और उदाहरणों और विकल्पों के लिए।


convert उदाहरण

मूवी को फ्रेम में निर्यात करने के लिए एक अन्य कमांड लाइन विधि होगी ffmpeg फिर जीआईएफ के साथ बनाओ convert ImageMagick (या ग्राफिक्समैजिक) से।

ffmpeg and convert
246k

  1. निर्यात फ्रेम:

     mkdir frames
     ffmpeg -i input -vf scale=320:-1:flags=lanczos,fps=10 frames/ffout%03d.png
    
  2. फिर उपयोग करें convert (या gm convert यदि आप अपने एनिमेटेड जीआईएफ बनाने के लिए ग्राफिक्स मैगिक पसंद करते हैं)

     convert -loop 0 frames/ffout*.png output.gif
    

साथ में convert आप फ्रेम के बीच देरी को नियंत्रित कर सकते हैं -delay अगर चाहा।


388
2018-02-22 21:31



कुछ उदाहरण परिणाम जोड़े गए (अभी भी फ्रेम अभी भी)। यहां, पहली फ़ाइल 4.1 एमबी है, दूसरा 8 एमबी के आसपास है। - slhck
@ लॉर्डनबेकर्ड, आप कमाल हैं! के लिए बहुत धन्यवाद -vf scale=320:-1,format=rgb8,format=rgb24 - Kamil Hismatullin
वैसे, के लिए convert पीएनजी फ्रेम से कनवर्ट करने के लिए कमांड का उपयोग करके मैं समाप्त हो गया convert -delay 5 -loop 0 -dither None -colors 80 "frames/ffout*.png" -fuzz "40%" -layers OptimizeFrame "output.gif", जो कुल फ़ाइल आकार को थोड़ा सा कम कर देता है - Wilf
मुझे लगता है convert कमांड का उपयोग करना चाहिए -delay 10 (फ्रेम के बीच 0.1 सेकंड) मैच के लिए -r 10 (10 एफपीएस) फ्रेम दर जो आप खिला रहे हैं ffmpeg। जब मैं उपयोग करता हूं -delay 5, मैं डबल गति पर gif खेल देखते हैं। - Jack O'Connor
ठीक है, मुझे मिल गया है, मैंने इस्तेमाल किया scale=0:-1, इसलिए जब आप स्केल सेट करते हैं 0, यह वीडियो से पैमाने ले जाएगा। - Mousa Alfhaily


यदि आप मध्यवर्ती छवि फ़ाइलों से बचना पसंद करेंगे, तो लॉर्डनेकबार्ड द्वारा प्रदान किए गए आदेशों को बीच में पाइप किया जा सकता है ffmpeg और ImageMagick है convert ताकि कोई इंटरमीडिएट फाइलों की आवश्यकता न हो:

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - output.gif

-f image2pipe वीडियो को छवियों में विभाजित करने के लिए ffmpeg बताता है और इसे पाइप करने के लिए उपयुक्त बनाता है, और -vcodec ppm पीपीएम होने के लिए आउटपुट प्रारूप निर्दिष्ट करता है (किसी कारण से प्रारूप पीएनजी है, या तो convert पाइप से सभी छवियों को नहीं पढ़ता है, या ffmpeg उन सभी को आउटपुट नहीं करता है)। - दोनों आदेशों के लिए निर्दिष्ट करता है कि क्रमशः आउटपुट और इनपुट के लिए एक पाइप का उपयोग किया जाएगा।

फ़ाइल को सहेजे बिना परिणाम को अनुकूलित करने के लिए, आप आउटपुट को पाइप कर सकते हैं convert एक सेकंड के लिए convert आदेश:

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - gif:- | convert -layers Optimize - output.gif

gif:- बताता है convert जीआईएफ स्वरूपित डेटा के रूप में अपने आउटपुट को पाइप करने के लिए -layers Optimize दूसरे को बताता है convert प्रदर्शन करने के लिए optimize-frame तथा optimize-transparancy विधियां (ImageMagick देखें एनिमेशन अनुकूलन का परिचय)। ध्यान दें कि से आउटपुट -layers Optimize हमेशा एक छोटा फ़ाइल आकार प्रदान नहीं कर सकता है, इसलिए आप सुनिश्चित करने के लिए पहले अनुकूलन के बिना एक gif में परिवर्तित करने का प्रयास कर सकते हैं।

याद रखें कि इस पूरी प्रक्रिया के दौरान सब कुछ स्मृति में है, इसलिए यदि छवियां काफी बड़ी हैं तो आपको पर्याप्त स्मृति की आवश्यकता हो सकती है।


80
2018-03-18 09:47



आदेशों का यह सेट भी काम करता है avconv - raphael
आपको अंतिम दो कन्वर्ट कमांड मर्ज करना चाहिए: convert -delay 5 -loop 0 -layers Optimize - output.gif - Clément
प्रतीत होता है कि gif स्रोत वीडियो की गति 2x पर चल रहा है? - Titan
@ टाइटन का मानना ​​है कि यह पहले कमांड में -10 और दूसरे में 5 है। मैंने देरी को 10 में भी बदल दिया और यह अब सामान्य रूप से खेलना प्रतीत होता है। - Steven Huang
आप इंटरमीडिएट छवि फ़ाइलों का उपयोग करके भी बच सकते हैं splitffmpeg में फ़िल्टर करें। कुछ भी पाइप करने की जरूरत नहीं है: ffmpeg -ss 30 -t 3 -i "input.flv fps=10,scale=320:-1:flags=lanczos,split[x][z];[z]palettegen[y];[x][y]paletteuse" output.gif - Ajedi32


Ffmpeg 2.6 के रूप में, हम और भी बेहतर कर सकते हैं:

palette="/tmp/palette.png"
filters="fps=15,scale=320:-1:flags=lanczos"

ffmpeg -i input.flv -vf "$filters,palettegen" -y $palette
ffmpeg -i input.flv -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y output.gif

हिंदुस्तान टाइम्स 


29
2018-03-23 18:39





मैंने स्क्रिप्ट का अपना संस्करण बनाया, जो आउटपुट रिज़ॉल्यूशन और फ्रेम दर को भी पैरामीटर करता है।

चल रहा है ./gifenc.sh input.mov output.gif 720 10 आपके द्वारा दी गई फिल्म से 720 पी चौड़ा 10fps जीआईएफ आउटपुट करेगा। आपको करने की आवश्यकता हो सकती है chmod +x gifenc.sh फ़ाइल के लिए।

#!/bin/sh

palette="/tmp/palette.png"

filters="fps=$4,scale=$3:-1:flags=lanczos"

ffmpeg -v warning -i "$1" -vf "$filters,palettegen" -y "$palette"
ffmpeg -v warning -i "$1" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$2"

आप मेरे बारे में विवरण पढ़ सकते हैं Github

धारणाएं: ffmpeg स्थापित है, और स्क्रिप्ट अन्य फ़ाइलों के समान फ़ोल्डर में है।


13
2017-07-12 09:35



आपकी लिपि के लिए बहुत बहुत धन्यवाद। मैंने अभी इसका परीक्षण किया और यह बहुत अच्छा काम करता है! - orschiro


एक स्क्रिप्ट, परीक्षण और काम किया।

उपयोग:

./avi2gif.sh ./vokoscreen-2015-05-28_12-41-56.avi

मज़ा है :)

vim avi2gif.sh

#!/bin/sh

INPUT=$1

# default settings, modify if you want.

START_AT_SECOND=0; # in seconds, if you want to skip the first 30 seconds put 30 here

LENGTH_OF_GIF_VIDEO=9999999; # in seconds, how long the gif animation should be

echo "Generate a palette:"
ffmpeg -y -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png

echo "Output the GIF using the palette:"
ffmpeg -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -i palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $INPUT.gif

Btw: vokoscreen लिनक्स के लिए एक उत्कृष्ट स्क्रीनकैप्चरिंग उपकरण है :)

बहुत कम माइकल Kohaupt धन्यवाद :) रॉक स्थिर।

कुछ फ़ाइल आकार आंकड़े:

5.3 एम = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K

देखें यहां परिणाम


8
2018-05-28 10:55





लिनक्स / यूनिक्स / MacOS

निम्नलिखित @LordNeckbeard दृष्टिकोण साथ में ffmpeg आदेश, कृपया निम्नलिखित उपयोगी बैश फ़ंक्शन ढूंढें जिन्हें आपके साथ जोड़ा जा सकता है ~/bash_profile फ़ाइल:

# Convert video to gif file.
# Usage: video2gif video_file (scale) (fps)
video2gif() {
  ffmpeg -y -i "${1}" -vf fps=${3:-10},scale=${2:-320}:-1:flags=lanczos,palettegen "${1}.png"
  ffmpeg -i "${1}" -i "${1}.png" -filter_complex "fps=${3:-10},scale=${2:-320}:-1:flags=lanczos[x];[x][1:v]paletteuse" "${1}".gif
  rm "${1}.png"
}

एक बार फ़ाइल लोड हो जाने के बाद (. ~/.bash_profile), आपके पास नया होना चाहिए video2gif आदेश।

उदाहरण का उपयोग:

video2gif input.flv

या:

video2gif input.flv 320 10

प्रति सेकंड 10 फ्रेम के साथ 320 चौड़ाई के लिए स्केल करें।

आप एक अलग वीडियो प्रारूप भी निर्दिष्ट कर सकते हैं (जैसे एमपी 4)।


मैक ओ एस

तुम कोशिश कर सकते हो जीआईएफ ब्रूवरी ऐप जो वीडियो फ़ाइलों से जीआईएफ बना सकता है।


वैकल्पिक रूप से ऐसी कई वेबसाइटें हैं जो ऑनलाइन रूपांतरण कर रही हैं।


7
2017-12-09 17:34





@Stephane का उत्तर बहुत अच्छा है। लेकिन यह एक चेतावनी मिलेगा Buffer queue overflow, dropping. कुछ वीडियो, और जेनरेट के लिए gif कुछ फ्रेम गिरा दिया गया है।

यहां एक बेहतर संस्करण है fifo से बचने के लिए फ़िल्टर करें Buffer queue overflow उपयोग करते समय paletteuse फिल्टर। का उपयोग करके split मध्यवर्ती पैलेट पीएनजी फ़ाइल के निर्माण से बचने के लिए फ़िल्टर करें।

ffmpeg -i input.mp4 -filter_complex 'fps=10,scale=320:-1:flags=lanczos,split [o1] [o2];[o1] palettegen [p]; [o2] fifo [o3];[o3] [p] paletteuse' out.gif

7
2017-10-05 12:04



अगर मैं इसे सही ढंग से समझता हूं, तो आप इनपुट को ओ 1 और ओ 2 में विभाजित कर रहे हैं, और ओ 2 को ओ 3 में कॉपी कर रहे हैं। तो आपको ओ 3 की आवश्यकता क्यों है? क्यों न सिर्फ ओ 2 का उपयोग करें? - Chloe
@Chloe क्या आप देखते थे fifo के बीच फ़िल्टर ऑपरेशन o2 तथा o3? से बचने के लिए Buffer queue overflow चेतावनी। - alijandro


ffmpeg पैलेट के साथ तरीका मध्यस्थ के बिना, एक ही कमांड में चलाया जा सकता है .png फ़ाइल।

ffmpeg -y -ss 30 -t 3 -i input.flv -filter_complex \
"fps=10,scale=320:-1:flags=lanczos[x];[x]split[x1][x2]; \
[x1]palettegen[p];[x2][p]paletteuse" output.gif

यह किया जा सकता है धन्यवाद split फिल्टर।


6
2017-09-30 15:23





चयनित उत्तर मानता है कि आप स्रोत वीडियो को स्केल करना चाहते हैं और उत्पादित जीआईएफ में अपने एफपीएस बदलना चाहते हैं। यदि आपको ऐसा करने की आवश्यकता नहीं है, तो निम्न कार्य करता है:

src="input.flv"
dest="output.gif"
palette="/tmp/palette.png"

ffmpeg -i $src -vf palettegen -y $palette
ffmpeg -i $src -i $palette -lavfi paletteuse -y $dest

यह आसान था जब मैं एक ऐसी जिफ चाहता था जिसने ईमानदारी से उस स्रोत वीडियो को फिर से बनाया जो मैं उपयोग कर रहा था।


4
2017-11-14 23:01