แปลง. pngs เป็นภาพเคลื่อนไหว. gif นับพันรายการ `convert` ใช้หน่วยความจำมากเกินไป


29

หลายคำถามถาม วิธีการสร้าง GIF แบบเคลื่อนไหว จากชุด ของภาพ PNGขอแนะนำให้ใช้ตัวแปรของ ImageMagick ของconvertคำสั่ง:

convert -delay 2 -loop 0 *.png animated.gif

อย่างไรก็ตามฉันมีภาพสองสามพันภาพและconvertใช้หน่วยความจำของฉันทั้งหมดสลับแล้วจึงล้มเหลว มีซอฟต์แวร์ทางเลือกใดบ้างที่มีหน่วยความจำมากขึ้น? ฉันสามารถใช้รูปแบบเปิดอื่นหาก.gifไม่รองรับและฉันชอบเครื่องมือ CLI


1
วิธีการเกี่ยวกับการแบ่งไฟล์ * .png ออกเป็นส่วนที่จัดการได้? สมมติว่าชื่อไฟล์ทั้งหมดเริ่มต้นด้วยหลักจากนั้นconvert -delay 2 -loop 0 0*.png animated.gifจะแปลงเฉพาะไฟล์ที่ขึ้นต้นด้วย '0' และอื่น ๆ
Jos

2
ดังนั้น. png แต่ละอันจะอยู่ในลำดับ 1 Mb หรือไม่ ในกรณีนี้สิ่งที่ฉันคิดได้ก็คือแปลงไฟล์. png เป็นความละเอียดหรือความลึกของสีน้อยลง
Jos

10
คุณบอกว่าคุณสามารถใช้รูปแบบเปิดอื่น สำหรับฉันดูเหมือนว่า gif ไม่ใช่รูปแบบที่ดีที่สุดสำหรับเฟรมนับพัน คุณได้พิจารณาการเข้ารหัสวิดีโอด้วย Ogg Theora แทนหรือไม่?
rekado

1
บางทีดูgifsicleถ้าคุณต้องการใช้ GIF จริง ๆ (ถึงแม้ว่าจะเป็นคนอื่น ๆ ได้กล่าวมานี้ไม่ได้เป็นสิ่ง GIF ถูกสร้างขึ้นมาสำหรับ; OGG จะเป็นทางเลือกที่ดีกว่า.)
wchargin

1
เรื่อง "โดยที่หน่วยความจำทั้งหมดกำลังดำเนินการ": 65 Kb เป็นขนาดไฟล์ของภาพที่บีบอัด เมื่อไม่มีการบีบอัดภาพจะมีขนาดประมาณ 4 x กว้าง x สูงไบต์ดังนั้นรูปภาพ 1024x768 จะใช้ RAM ประมาณ ~ 3Mb ทวีคูณด้วย "สองสามพัน" แล้วคุณจะเห็นว่าหน่วยความจำกำลังจะไปไหน ...
Sergey

คำตอบ:


33

ดูเหมือนว่าคุณกำลังพยายามสร้างวิดีโอ หากเป็นเช่นนั้นฉันจะใช้รูปแบบวิดีโอที่เหมาะสม

ในกรณีนี้ฉันจะใช้ffmpegเพื่อแปลงไฟล์ PNG แต่ละไฟล์เป็นวิดีโอ H.264 เนื่องจาก ffmpeg ถูกสร้างมาเพื่อทำงานกับวิดีโอที่มีความยาวหลายชั่วโมงจึงไม่น่าจะมีปัญหากับรูปภาพนับพันของคุณ ใช้ H.264 แทนภาพเคลื่อนไหว GIF จะส่งผลให้กว้างใหญ่ปรับปรุงคุณภาพของภาพ

สิ่งนี้จะเหมาะกับคุณ:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2: วิธีนี้ตั้งค่าอัตราเฟรมเป็นครึ่งหนึ่ง FPS หรือ 2 วินาทีต่อเฟรม
  • -i img%04d.png: นี้จะบอก ffmpeg ในการอ่านไฟล์แม้ว่าimg0000.pngimg9999.png
  • -c:v libx264: ใช้ตัวแปลงสัญญาณวิดีโอ libx264
    • คุณสามารถระบุพารามิเตอร์การบีบอัดวิดีโอได้ที่นี่หากต้องการ:
    • -crf <number>: การตั้งค่าคุณภาพ 0 ถึง 51 23 เป็นค่าเริ่มต้น 0 คือการเข้ารหัส lossless จริงซึ่งจะมีแบนด์วิดท์สูงมาก 18 เกือบจะสูญเสียสายตา
  • -r 30: ตั้งค่าเอาต์พุตเฟรมเป็น 30 FPS รูปภาพอินพุตแต่ละรายการจะถูกทำซ้ำเพื่อให้ได้ผลลัพธ์ตามที่คุณระบุที่นี่ คุณสามารถปล่อยพารามิเตอร์นี้ไว้และไฟล์เอาต์พุตจะอยู่ที่เฟรมรับภาพ แต่ภาพยนตร์ที่ได้นั้นไม่แสดงผลอย่างถูกต้องเมื่อฉันลองใช้ดู
  • out.mp4: ชื่อไฟล์ที่ส่งออก

อ้างอิง:


1
การขยายตัวที่ดีของคำตอบ Frantique จากวันก่อน
Elder Geek

นี่คือมาตรฐาน ffmpeg เปรียบเทียบกับ ImageMagick ที่เรียบง่ายพร้อมข้อมูลการทดสอบที่เป็นรูปธรรม: askubuntu.com/questions/648244//
Ciro Santilli 新疆改造中心中心法轮功六四事件

11

โดยส่วนตัวแล้วฉันเพิ่งจะเปิดมันในจำนวนไฟล์ที่ จำกัด แทนที่จะเป็นทั้งหมดในครั้งเดียว ตัวอย่างเช่นสิ่งนี้:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif

8

ใช้-limit memory 1GiBเพื่อ จำกัด จำนวนหน่วยความจำที่convertใช้

รูปภาพจำนวน 1,000 รูปจะสร้าง GIF ขนาดใหญ่ที่คอมพิวเตอร์ส่วนใหญ่จะต่อสู้เพื่อแสดงผล ฉันเก็บภาพเคลื่อนไหว GIF ของฉันต่ำกว่า 200 ภาพเมื่อเป็นไปได้ ยิ่งน้อยยิ่งดี rm *[13579].pngหากคุณเป็นอันดับภาพของคุณคำสั่งนี้จะลบภาพเลขคี่

ดังนั้นนี่คือขั้นตอนการทำงานทั่วไปของฉันสำหรับการสร้างภาพเคลื่อนไหว GIF จากฉากภาพยนตร์:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif

1
ขอบคุณวิธีแก้ปัญหานี้ใช้ได้ดี นอกจากนี้ยังอาจจำเป็นต้องเพิ่มขีด จำกัด หน่วยความจำที่อนุญาตใน /etc/ImageMagick-6/policy.xml ดูgithub.com/ImageMagick/ImageMagick/issues/ ...... สำหรับข้อมูลเพิ่มเติม
Louis Gagnon

4

ฉันสามารถใช้รูปแบบเปิดอื่นได้หาก.gifไม่รองรับ

บางทีAPNGก็มีประโยชน์สำหรับคุณ มันรองรับเบราว์เซอร์บางตัวรวมถึง Firefox แต่ในขณะนี้ยังไม่รวม Chrome และ IE เนื่องจากเป็นเพียงส่วนขยาย PNG จึงเป็นเรื่องง่ายมากที่จะแปลง PNG เป็น APNG apngasmเครื่องมือที่สามารถทำเช่นนั้น แต่รูปแบบนั้นง่ายมากที่ฉันเพิ่งเขียนแอสเซมเบลอร์ APNG ด้วยตนเองสำหรับ Sage การปรับรหัสนั้นจะเป็นทางเลือก


ฉันอยากจะชี้ให้เห็นว่า APNG นั้นไม่ได้มาตรฐานและแม้จะอยู่มาประมาณ 7 ปีแล้วก็ยังคลุมเครือมาก
Pharap

สำหรับการสาธิตทางวิทยาศาสตร์ที่คุณสามารถเลือกเบราว์เซอร์ที่ใช้งานได้นี่อาจเป็นวิธีที่ง่ายและมีประสิทธิภาพ
MvG

ขึ้นอยู่กับว่าใครจะดูการสาธิต การคัดลอกไปยังผู้ชมจะไม่ดีนักจากนั้นสองในสามต้องออกไปและดาวน์โหลด Firefox เพื่อดู ไม่ใช่ความประทับใจที่ฉันต้องการหากฉันได้ทำการสาธิตทางวิทยาศาสตร์ที่สำคัญ หากมีวัตถุประสงค์เพื่อให้ดูเป็นส่วนหนึ่งของการสาธิตก็ยุติธรรมพอ แต่อาจไม่เหมาะสำหรับสถานการณ์อื่น ๆ
Pharap

3

หากคุณมี png-s หลายพันรูปแบบ anigif นั้นแปลก ฉันจะทำด้วยวิธีนี้โดยใช้avconv:

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov

วิธีการนี้มีประโยชน์เพิ่มเติมที่คุณสามารถนำไปใช้ในการเพิ่มเสียงหรือเสียงเพลงซึ่งเป็นไปไม่ได้ในรูปแบบการแลกเปลี่ยนทางกราฟิก
Elder Geek

2

gifsicleเป็นโปรแกรมอรรถประโยชน์บรรทัดคำสั่งเพื่อจัดการภาพเคลื่อนไหว GIF หากคุณยินดีแลกเปลี่ยนหน่วยความจำเพื่อความเร็วคุณสามารถใช้สวิตช์ --conserve- หน่วยความจำ


ให้ฉันใส่มันด้วยวิธีนี้: gifsicle แล้วมีรอยขนาดเล็กกว่า ImageMagick - ถ้าคุณพบว่ามันยังคงใช้หน่วยความจำมากเกินไปสำหรับงานในมือแล้วคุณสามารถใช้ --conserve หน่วยความจำ
codehead

โอ้ฉันคิดว่าฉันเข้าใจผิดในสิ่งที่คุณพูดว่าสวิตช์จะใช้หน่วยความจำมากขึ้นซึ่งไม่สมเหตุสมผล ไม่เป็นไร.
อยากรู้อยากเห็น dannii

2

นอกเหนือจากคำตอบอื่น ๆ : เนื่องจากคุณต้องการผลิตไฟล์ GIF ฉันถือว่าคุณต้องการแสดงภาพบนหน้าเว็บ ถ้าเป็นเช่นนั้นฉันจะไม่เปลี่ยนใจแปลง PNG ของคุณเลย เพียง google สำหรับ "สไลด์โชว์ javascript" และใช้สคริปต์ฟรีหนึ่งในล้าน หรือเขียนของคุณเองนี่เป็นเรื่องจริงเล็กน้อย

ประโยชน์ของการทำแบบนี้คือ:

  • โหลดภาพเดียวในเบราว์เซอร์ตลอดเวลาสไลด์โชว์เริ่มต้นอย่างรวดเร็วและไม่กิน RAM มากในเครื่องของผู้ใช้

  • โซลูชันจะปรับขนาดเป็นล้านภาพ หรือหลายพันล้านถ้าคุณอดทนพอที่จะดูพวกเขาทั้งหมด :)

  • คุณสามารถเพิ่มการควบคุมในหน้าของคุณเพื่อหยุดชั่วคราวย้อนกลับเปลี่ยนความล่าช้าหรือไปที่เฟรมเฉพาะ


ขอบคุณ Sergey อันที่จริงนี่ไม่ใช่สำหรับแสดงบนหน้าเว็บ +1 สำหรับแนวคิดนี้
dotancohen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.