ฉันจะแปลง gif แบบเคลื่อนไหวเป็น mp4 หรือ mv4 บนบรรทัดคำสั่งได้อย่างไร


79

ฉันจะใช้คำสั่งใดในการแปลงไฟล์วิดีโอ mp4 หรือ mv4 เป็น gif แบบเคลื่อนไหวและในทางกลับกัน นั่นคือแปลงภาพเคลื่อนไหว gif เป็น mp4 หรือ mv4

คำตอบ:


108

นี่คือสิ่งที่ทำงานสำหรับฉัน:

ffmpeg -i animated.gif -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" video.mp4

movflags - ตัวเลือกนี้ปรับโครงสร้างของไฟล์ MP4 ให้เบราว์เซอร์สามารถโหลดได้เร็วที่สุด

pix_fmt - วิดีโอ MP4 เก็บพิกเซลในรูปแบบที่แตกต่างกัน เรามีตัวเลือกนี้เพื่อระบุรูปแบบเฉพาะซึ่งมีความเข้ากันได้สูงสุดกับเบราว์เซอร์ทั้งหมด

vf - วิดีโอ MP4 ที่ใช้ H.264 จำเป็นต้องมีขนาดที่สามารถหารด้วย 2 ตัวเลือกนี้ช่วยให้มั่นใจได้ว่าเป็นอย่างนั้น

ที่มา: http://rigor.com/blog/2015/12/optimizing-animated-gifs-with-html5-video


4
ขอบคุณนี่เป็นเวอร์ชั่นเดียวที่ใช้ได้สำหรับฉันบน osx
Pykler

1
สิ่งนี้ใช้ได้กับฉันใน Ubuntu 16.10 ด้วย ffmpeg 3.0.2 ซึ่งคำตอบยอดนิยมไม่ได้
cat

1
อาจครอบตัดแทนการปรับขนาด (แทนที่scaleด้วยcrop) เนื่องจากคุณจะตัดได้เพียง 1 พิกเซลเท่านั้น การขยายอาจทำให้สิ่งต่าง ๆ เบลอ
Jezzamon

สิ่งนี้ทำให้ฉันไม่กี่วินาทีสุดท้าย ผลลัพธ์ที่ mp4 สิ้นสุดลงก่อน
callum

38

ในกรณีของฉันการใช้ffmpegเคล็ดลับนั้นโดยตรงและให้ผลลัพธ์ที่ดีที่สุด:

$ ffmpeg -f gif -i infile.gif outfile.mp4

2
ผลิตวิดีโอเปล่า (เสียหาย) บน os x
Pykler

2
@Pykler คุณน่าจะเพิ่ม verbosity และ / หรือตรวจสอบไฟล์บันทึกเพื่อทำความเข้าใจว่าเกิดอะไรขึ้น
BenC

ฉันด้วยเช่นกันอาจจะแนะนำให้ "หารด้วย 2 มิติ" ในคำตอบของ vico Vault (ซึ่งใช้งานได้สำหรับฉัน)
lapo

วิธีนี้ใช้ได้ผลดีสำหรับฉัน (คำตอบยอดนิยมทำให้เกิดการตัดปลาย 3 วินาที) แก้ไข: โอ้ แต่มันไม่ได้เล่นบน iOS :(
callum

หน้าเว็บบอกว่าคุณก็ควรจะเพิ่ม -pix_fmt yuv420p
beefeather

2

อีกวิธีในการแปลงภาพเคลื่อนไหว GIF เป็นวิดีโอ:

ffmpeg -i your_gif.gif -c:v libvpx -crf 12 -b:v 500K output.mp4

-crf ค่าสามารถไปจาก 4 ถึง 63 ค่าที่ต่ำกว่าหมายถึงคุณภาพที่ดีขึ้น -b: v เป็นบิตเรตสูงสุดที่อนุญาต หมายถึงคุณภาพที่สูงขึ้น


2

หากคุณต้องการสร้างเอาต์พุตใน"n ลูป"ดูวิธีแก้ปัญหานี้ในนัดเดียว

ลองเปลี่ยนnormal.gifเป็นloop.mp4

สำหรับตัวอย่างภาพยนตร์ 2 ลูป:

ffmpeg -stream_loop 2 -i normal.gif loop.gif -y;ffmpeg -i loop.gif -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" loop.mp4 -y

สำหรับตัวอย่างภาพยนตร์ 5 ลูป:

ffmpeg -stream_loop 5 -i normal.gif loop.gif -y;ffmpeg -i loop.gif -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" loop.mp4 -y

ระวังตัว: มี[ -yสำหรับการเขียนทับ]


หากคุณรันffmpegคำสั่งแรกโดยไม่ต้องใช้ -yคุณจะมีโอกาสน้อยมากที่จะเขียนทับสิ่งที่คุณไม่ต้องการโดยบังเอิญ ( อาจเป็นวิธีที่ffmpegจะไปป์วิดีโอลงในตัวเองและทำสิ่งนี้ในคำสั่ง
piped

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