วิธีการสร้าง GIF เคลื่อนไหวจากวิดีโอ MP4 ผ่านบรรทัดคำสั่ง?


119

ฉันต้องการสร้างภาพเคลื่อนไหว.gifจาก.mp4วิดีโอ ฉันต้องการทำจากบรรทัดคำสั่งดังนั้นโปรดแสดงรายการเครื่องมือบรรทัดคำสั่งเท่านั้น


คุณสามารถใช้สคริปต์นี้บน Githubที่ใช้ FFMPEG และสร้างจานสีระดับกลางเพื่อคุณภาพของภาพที่ดีขึ้น
troyane

คำตอบ:


128

ffmpeg 3.4.4 สามารถทำได้โดยตรงบน Ubuntu 18.04

คุณอาจต้องการใช้สิ่งต่อไปนี้:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

ทดสอบขั้นตอนการสร้างข้อมูลที่อธิบายไว้ในโพสต์นี้

โดยตรงมากขึ้น:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

ยังใช้งานได้ แต่เอาต์พุต GIF จะมีขนาดใหญ่กว่าวิดีโออินพุตเนื่องจากรูปแบบวิดีโอบีบอัดอย่างชาญฉลาดข้ามเฟรม

การแยกอาร์กิวเมนต์:

  • ulimit -Sv 1000000: ตั้งค่าขนาดหน่วยความจำสูงสุด 1Gb สำหรับโปรแกรม

    ส่วนใหญ่ฉันมั่นใจว่าคำสั่งไม่ได้ใช้หน่วยความจำไม่ จำกัด เช่นความพยายามก่อนหน้านี้บางอย่าง

    500Mb ทำให้ ffmpeg ไม่สามารถโหลดไลบรารีที่ใช้ร่วมกัน ... ถึงเวลาอัพเกรด RAM ของคุณแล้วหรือยัง

  • -ss 00:00:03 -to 00:00:06: เวลาเริ่มต้นและสิ้นสุดเพื่อตัดวิดีโอจาก

    ไม่ GIFs ไม่ใช่วิธีที่ดีที่สุดในการละเมิดลิขสิทธิ์แจกจ่ายวิดีโอออนไลน์

    ดูเพิ่มเติมที่: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpegeg

  • -vf scale=512:-1: ทำ512พิกเซลความสูงออกและปรับความกว้างเพื่อรักษาอัตราส่วนภาพ

    นี่เป็นกรณีการใช้งานทั่วไปสำหรับรูปภาพสำหรับเว็บซึ่งมีความละเอียดน้อยกว่าวิดีโอมาก

    หากคุณลบตัวเลือกนี้เอาต์พุต GIF จะมีความสูงเท่ากับวิดีโออินพุต

    ความสูงวิดีโอต้นฉบับสามารถพบได้เช่นกับffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178และเป็น 1024 x 1024 ในกรณีของเรา

  • -r 15: การสุ่มตัวอย่าง FPS

    ตัวอย่างเช่นวิดีโอต้นฉบับคือ 30 FPS ดังนั้น-r 15หมายความว่าffmpegจะเลือกหนึ่งเฟรมในทุก ๆ 2 ( = 30 / 15)

    FPS ที่รับรู้จะได้รับการปรับเพื่อให้ตรงกับอินพุตดังนั้นคุณจะไม่สังเกตเห็นการเร่งความเร็ว

    สามารถพบอินพุต FPS พร้อมกับffprobeจำนวนเฟรมอินพุตทั้งหมดพร้อมด้วยmediainfoตามที่อธิบายไว้ที่: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-a-Video-on-the-ลินุกซ์บรรทัดคำสั่ง / 1044894 # 1044894

    ฉันแนะนำตัวเลือกนี้เนื่องจากรูปแบบวิดีโอมักจะมีอัตราเฟรมที่สูงกว่าเนื่องจากความละเอียดที่มากขึ้น ด้วย GIF ที่เล็กลง framerate ที่ต่ำกว่าจะสังเกตเห็นได้น้อยดังนั้นเราจึงสามารถข้ามเฟรมบางส่วนและสร้าง GIF ที่เล็กกว่าได้

ก่อนหน้า 18.04: ffmpeg+ convertหนึ่งซับโดยไม่มีไฟล์กลาง

ffmpegไม่สามารถจัดการกับ GIF ก่อนหน้านี้ สิ่งที่ดีที่สุดที่ฉันมีก็คือ:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

คำอธิบายของข้อโต้แย้ง:

  • -loop 0: เพิ่มฟิลด์นับลูปส่วนขยาย Netscape Gif ให้กับเอาต์พุต 0 หมายถึงวง จำกัด ตามที่อธิบายไว้ที่: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog , firefoxและโครเมียมห่วงทุกเพียบโดยค่าเริ่มต้นได้โดยไม่ต้องมันดังนั้นฉันไม่แน่ใจว่ามันจำเป็น เป็นอีกแล้ว

  • -delay 5เวลารอก่อนที่จะแสดงเฟรมถัดไปใน hundreths ที่สองตามที่อธิบายไว้ที่: https://en.wikipedia.org/wiki/GIF#Animated_GIFไบต์ 324 ดังนั้น100หมายความว่า 1 FPS, วิธีการ51 / 0.5 == 20FPS

แม้ว่าคุณจะลดความสูงและอัตราเฟรม GIF เอาต์พุตอาจยังคงมีขนาดใหญ่กว่าวิดีโอเนื่องจากรูปแบบวิดีโอที่ไม่ใช่ GIF "จริง" บีบอัดข้ามเฟรมในขณะที่ GIF บีบอัดเฉพาะเฟรมแต่ละเฟรมเท่านั้น

โดยตรง

convert input.mp4 rpi2-bare-metal-blink.gif

ทำงานได้ แต่เกือบจะฆ่าคอมพิวเตอร์ของฉันเพราะหน่วยความจำล้นและผลิต ouptput 100x ที่ใหญ่กว่าสำหรับไฟล์อินพุต 2s 1Mb ของฉัน บางที ImageMagick วันหนึ่งอาจจะทัน

ดูเพิ่มเติมที่: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

ทดสอบกับ Ubuntu 17.10


1
Downvoters โปรดอธิบาย ;-)
Ciro Santilli 新疆改造中心法轮功六四事件

1
การหน่วงเวลาของคุณไม่ตรงกับค่า -r ของคุณ (gif ที่ได้คือความเร็ว 2x) นอกจากนี้คุณยังเพิ่มอาร์กิวเมนต์สเกลโดยไม่มีเหตุผลที่ชัดเจน (ทำให้ gif เล็กมาก)
asmeurer

2
ฉันเห็นด้วย. gif ขนาดเล็กดีกว่าสำหรับเว็บ ขอบคุณสำหรับ scale=320:-1
zombic

2
สำหรับผู้ที่สงสัยว่าการลบ-r 10จะทำให้ GIF กลับมาเป็นความเร็วปกติ
มิทช์

2
ฉันได้ gif ใหญ่กว่า mp4 20%: O
Adam Goldman

113

สองขั้นตอน:

  • แยกภาพจากวิดีโอ

    สร้างไดเรกทอรีชื่อ frames ในไดเรกทอรีเดียวกันกับ.mp4ไฟล์ของคุณ ใช้คำสั่ง:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    แหล่ง

  • แปลงรูปภาพเป็น gif

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    เอกสาร: แปลงตัวเลือก gif

คุณจะจบลงด้วยไฟล์ที่ค่อนข้างใหญ่ลองดูที่คู่มือ magick ของรูปภาพเพื่อปรับ gif ให้เหมาะสมกับตัวเลือกที่คุณสามารถเพิ่มในคำสั่งขั้นตอนที่สองเพื่อรับไฟล์ที่มีขนาดเล็กลง


1
คำตอบที่ดี - ข้อมูลเพิ่มเติมบางอย่าง: ffmpeg สามารถติดตั้งได้โดยใช้คำแนะนำที่นี่
chepyle

3
โปรดทราบว่าframesโฟลเดอร์ต้องมีอยู่เพื่อให้คำสั่งแรกทำงาน
totymedli

3
สำหรับผู้ที่ต้องการวิธีที่รวดเร็วเพื่อเพิ่มประสิทธิภาพการทำงานโดยทั่วไปและมีความขี้เกียจเกินไปที่จะอ่านลิงค์เพียงแค่เพิ่ม-layers Optimizeไปยังหน้าล่าสุดคำสั่งก่อนconvert *.jpgตรวจสอบผลลัพธ์ แต่อาจได้รับผลกระทบ สำหรับฉันมันลดขนาด gif จาก 5 MB เป็น 700 KB โดยไม่มีการสูญเสียคุณภาพที่รับรู้ :)
cpury

ขอบคุณที่เป็นกระบวนการที่น่าสนใจ mp4 5.6MB จบลงด้วย 236MB gif ไม่แน่ใจว่าฉันจะทำอย่างนั้นบนเว็บไซต์ของฉัน;) อาจเป็น gif ต้อง จำกัด ไม่กี่วินาทีแทนที่จะเป็นนาที
กระวาน

2
แทนที่จะใช้รูปแบบไฟล์ JPG สูญเสียมากกับการตั้งค่าเริ่มต้นฉันขอแนะนำให้ใช้ PNG สำหรับการส่งออกไฟล์เริ่มต้น ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F

12

gififyเป็นยูทิลิตี้ที่ใช้โหนดแบบ all-in-one ที่ทำให้การแปลงง่ายขึ้น มันขึ้นอยู่กับnodejs, npm, ffmpegและimagemagickที่มีอยู่ทั้งหมดใน Repos

เมื่อคุณnpmติดตั้งแล้วคุณสามารถติดตั้งได้gififyทั่วโลกด้วย:

    npm install -g gifify

วิดีโอสามารถแปลงเป็น. GIF ด้วย:

    gifify video.mp4 -o video.gif

นอกจากนี้คุณยังสามารถเลือกที่จะเริ่มต้นและสิ้นสุดตำแหน่งในวิดีโอและเพิ่มคำบรรยายใต้ภาพ:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

❗️อาจใช้เวลาหลายนาทีในการแปลงให้เสร็จสมบูรณ์แม้จะมีวิดีโอขนาดเล็กลง

หมายเหตุ: ffmpegและimagemagickอาจต้องคอมไพล์ด้วยไลบรารีเฉพาะบางอย่าง (เช่น libass และ fontconfig ตามลำดับ)


ไม่สามารถจัดการกับคลิปได้ประมาณ> 40 วินาที: github.com/vvo/gifify/issues/99
oligofren

19.04: แพคเกจอื่นที่จำเป็นคือgifsicleแต่แล้วก็มีปัญหาอื่นเกิดขึ้น: github.com/vvo/gifify/issues/95นอกจากนี้คุณจะบอกให้เราทราบถึงการเริ่มต้น npm ในไดเรกทอรีที่จะเรียกใช้npm installหรือไม่และเรียกใช้เป็นรูทหรือไม่ ขอบคุณ!
Nicolas Raoul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.