سؤال كيف أقوم بتحويل فيديو إلى GIF باستخدام ffmpeg ، بجودة معقولة؟


أنا أتحول 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 يمكن الآن إخراج جودة أعلى GIF. إذا كنت تستخدم اعتبارًا قديمًا للبناء تحميل بناء ثابت حديث أو تجميع 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. إخراج ملف GIF باستخدام اللوحة:

    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
    

نرى جودة عالية GIF مع FFmpeg للعديد من الأمثلة والخيارات.


convert مثال

طريقة أخرى لسطر الأوامر هي تصدير الفيلم إلى الإطارات باستخدام ffmpeg ثم جعل GIF مع convert من ImageMagick (أو GraphicsMagick).

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 إذا كنت تفضل استخدام GraphicsMagick) ، فيمكنك إنشاء صورة GIF متحركة:

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

مع convert يمكنك التحكم في التأخير بين الإطارات مع -delay اذا رغب.


388
2018-02-22 21:31



إضافة بعض النتائج سبيل المثال (لا تزال مجرد إطارات رغم ذلك). هنا ، أول ملف هو 4.1 ميغابايت ، والثاني حوالي 8 ميغابايت. - slhck
LordNeckbeard ، أنت رائع! شكرا جزيلا ل -vf scale=320:-1,format=rgb8,format=rgb24 - Kamil Hismatullin
بالمناسبة ، من أجل convert الأمر للتحويل من إطارات PNG انتهيت باستخدام 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


إذا كنت تفضل تجنب ملفات الصور المتوسطة ، يمكن تمرير الأوامر التي يوفرها LordNeckBeard بين 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 لتوجيه الإخراج الخاص به كما gif تنسيق البيانات و -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
يبدو أن الصورة المتحركة قيد التشغيل بمعدل 2 ضعفًا لسرعة الفيديو المصدر؟ - Titan
يعتقدTitan أنه -r 10 في الأمر الأول و -delay 5 في الثانية. لقد غيرت التأخير إلى 10 أيضا ويبدو أنه يلعب عادة الآن. - Steven Huang
يمكنك أيضًا تجنب ملفات الصور المتوسطة باستخدام split مرشح في ffmpeg. لا حاجة إلى أي شيء على الإطلاق: 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

HT 


29
2018-03-23 18:39





لقد قدمت نسختك الخاصة من النص البرمجي ، والتي تحدد دقة الإخراج ومعدل الإطارات كذلك.

جري ./gifenc.sh input.mov output.gif 720 10 سوف إخراج 720p 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"

يمكنك قراءة التفاصيل على بلدي جيثب

الافتراضات: تم تثبيت ffmpeg ، والبرنامج النصي في نفس المجلد مثل الملفات الأخرى.


13
2017-07-12 09:35



شكرا جزيلا على السيناريو الخاص بك. لقد اختبرت ذلك للتو وهو يعمل بشكل رائع! - orschiro


عمل برنامج نصي واختباره ويعمل.

الاستعمال:

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

لقد PHUN :)

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

راجع للشغل: vokoscreen هو أداة ScreenCapturing ممتازة لينكس :)

شكرا لوط مايكل Kohaupt :) صخرة ثابتة.

بعض احصائيات حجم الملف:

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

انظر النتائج هنا.


8
2018-05-28 10:55





لينكس / يونكس / ماك

التالية LordNeckbeard النهج مع ffmpeg الأمر ، يرجى الاطلاع على وظيفة Bash المفيدة التالية والتي يمكن إضافتها إلى ~/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

الحجم إلى 320 عرضًا مع 10 إطارات في الثانية.

يمكنك أيضًا تحديد تنسيق فيديو مختلف (مثل mp4).


ماك

يمكنك المحاولة GIF بيرة التطبيق الذي يمكنه إنشاء ملفات GIF من ملفات الفيديو.


بدلاً من ذلك ، هناك العديد من مواقع الويب التي تجري عمليات تحويل عبر الإنترنت مجانًا.


7
2017-12-09 17:34





الجواب منStephane جيد جدا. ولكن سوف تحصل على تحذير مثل Buffer queue overflow, dropping. لبعض الفيديو ، ولدت gif قد انخفض بعض الإطار.

هنا نسخة أفضل مع fifo مرشح لتجنب Buffer queue overflow عند استخدام paletteuse منقي. باستخدام split مرشح لتجنب إنشاء ملف PNG لوحة الألوان المتوسطة.

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



إذا فهمت ذلك بشكل صحيح ، فأنت تقوم بتقسيم الإدخال إلى o1 و o2 ، ونسخ o2 إلى o3. فلماذا تحتاج O3؟ لماذا لا نستخدم o2 مباشرة؟ - 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