วิธีการสร้างวิดีโอจากภาพด้วย FFmpeg


165
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

บรรทัดนี้ใช้ได้ดี แต่ฉันต้องการสร้างไฟล์วิดีโอจากภาพในโฟลเดอร์อื่น ชื่อภาพในโฟลเดอร์ของฉันคือ:

img001.jpg
img002.jpg
img003.jpg
...

ฉันจะใส่ไฟล์ภาพจากโฟลเดอร์อื่นได้อย่างไร? ตัวอย่าง:C:\mypics

ฉันลองใช้คำสั่งนี้ แต่ffmpegสร้างวิดีโอด้วยภาพแรก (img001.jpg) เท่านั้น

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

คำตอบ:


168

ดูสร้างสไลด์โชว์วิดีโอจากภาพ - FFmpeg

หากวิดีโอของคุณแสดงเฟรมไม่ถูกต้องหากคุณพบปัญหาเช่นภาพแรกถูกข้ามไปหรือแสดงเพียงหนึ่งเฟรมให้ใช้ตัวกรองวิดีโอ fpsแทน-rสำหรับเฟรมเอาท์พุท

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

อีกวิธีหนึ่งคือตัวกรองรูปแบบวิดีโอสามารถเพิ่มลงในห่วงโซ่ตัวกรองเพื่อแทนที่yuv420p -pix_fmtเช่น"เฟรมต่อวินาที = 25, รูปแบบ = yuv420p" ข้อดีของวิธีนี้คือคุณสามารถควบคุมได้ว่าตัวกรองใดที่จะไปก่อน

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

ฉันทดสอบพารามิเตอร์ด้านล่างมันใช้งานได้สำหรับฉัน

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

พารามิเตอร์ด้านล่างใช้งานได้ แต่จะข้ามภาพแรกเสมอ

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

ทำวิดีโอจากภาพที่วางไว้ในโฟลเดอร์ที่แตกต่างกัน

ก่อนอื่นให้เพิ่มเส้นทางของภาพไปที่imagepaths.txtเช่นด้านล่าง

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

ตัวอย่างการใช้งานดังนี้

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0พารามิเตอร์ป้องกันข้อผิดพลาดชื่อไฟล์ที่ไม่ปลอดภัย

ลิงก์ที่เกี่ยวข้อง

FFmpeg สร้างวิดีโอจากภาพที่วางไว้ในโฟลเดอร์ที่แตกต่างกัน

FFMPEG ลำดับที่แนะนำกลาง / ภาพ

เชื่อมต่อ - FFmpeg


"หากวิดีโอของคุณแสดงเฟรมไม่ถูกต้องหากคุณพบปัญหาเช่นภาพแรกถูกข้ามไปหรือแสดงเพียงหนึ่งเฟรมให้ใช้ตัวกรองวิดีโอ fps แทน"ขออภัย แต่คุณช่วยอธิบายความหมายของ "fps" ได้อย่างไร ตัวกรองวิดีโอ "ใช่มั้ย
arnuschky

3
เท่าที่ฉันรู้พารามิเตอร์ –r คืออัตราเฟรมที่เปลี่ยนแปลงซึ่งหมายความว่า FFMPEG อาจลดลงหรือเฟรมซ้ำเพื่อให้ได้อัตราเฟรมเอาต์พุตที่ต้องการ การใช้ตัวกรอง fps“ -vf fps = value” บังคับให้ FFMPEG สร้างอัตราเฟรมคงที่ ดูสร้างสไลด์โชว์วิดีโอจากภาพ - FFmpegและสิ่งนี้ (เทคนิค) แตกต่างกันอย่างไรระหว่าง -r และ fps filter? . ดังนั้นการใช้-rพารามิเตอร์บางครั้ง couse ข้ามภาพแรก ..
khan

คำสั่งแรกในรายการนี้ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4ดูเหมือนว่าจะใช้งานได้ แต่ในที่สุดก็ส่งผลให้วิดีโอที่ผู้เล่นคนใดไม่สามารถอ่านได้ (บน Ubuntu) VNC กล่าวว่า "ไม่พบ moov atom" พยายามแก้ไขปัญหานี้โดยqt-faststartสร้างข้อผิดพลาด "อะตอมสุดท้ายในไฟล์ไม่ใช่อะตอม moov"
sh37211

149

-pattern_type glob

ตัวเลือกที่ยอดเยี่ยมนี้ทำให้การเลือกภาพในหลาย ๆ กรณีง่ายขึ้น

วิดีโอสไลด์โชว์ที่มีหนึ่งภาพต่อวินาที

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

เพิ่มเพลงลงในมันตัดเมื่อเสียงที่มีความยาวคงที่เมื่อภาพสิ้นสุด:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

นี่คือตัวอย่างสองตัวอย่างบน YouTube:

เป็นพวกฮิปปี้และใช้รูปแบบวิดีโอที่ไม่มีสิทธิบัตรของ Theora :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

แน่นอนว่ารูปภาพของคุณควรถูกจัดเรียงตามตัวอักษรโดยทั่วไปเป็น:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

และอื่น ๆ

ฉันยังต้องแน่ใจก่อนว่ารูปภาพทั้งหมดที่จะใช้มีอัตราส่วนเดียวกันอาจเป็นได้โดยการครอบตัดรูปภาพด้วยimagemagickหรือNomacsล่วงหน้าเพื่อที่ ffmpeg จะไม่ต้องตัดสินใจอย่างหนัก โดยเฉพาะอย่างยิ่งความกว้างจะต้องหารด้วย 2 มิฉะนั้นการแปลงจะล้มเหลวด้วย: "ความกว้างไม่หารด้วย 2"

วิดีโอความเร็วปกติที่มีหนึ่งภาพต่อเฟรมที่ 30 FPS

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

นี่คือสิ่งที่ดูเหมือนว่า:

สร้างจาก GIF ด้วย: /ubuntu/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

เพิ่มเสียง:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

ผลลัพธ์: https://www.youtube.com/watch?v=HG7c7lldhM4

นี่คือสื่อทดสอบที่ฉันใช้:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

รูปภาพที่สร้างด้วย: วิธีใช้ GLUT / OpenGL เพื่อแสดงผลไฟล์

มันยอดเยี่ยมที่จะสังเกตว่าวิดีโอบีบอัดลำดับภาพอย่างไรดีกว่า ZIP เนื่องจากสามารถบีบอัดข้ามเฟรมด้วยอัลกอริธึมพิเศษ:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3 ล้าน

แปลงไฟล์เพลงหนึ่งไฟล์เป็นวิดีโอที่มีภาพคงที่สำหรับการอัปโหลด YouTube

ตอบแล้วเมื่อ: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

สไลด์โชว์แบบเต็มกรณีการติดตั้งกรณีศึกษาจริงทีละขั้นตอน

มีอีกเล็กน้อยที่การสร้างสไลด์โชว์กว่าการใช้คำสั่ง ffmpeg เดียวดังนั้นนี่คือตัวอย่างรายละเอียดที่น่าสนใจที่ได้รับแรงบันดาลใจจากไทม์ไลน์นี้

รับสื่ออินพุต:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

ตอนนี้เรามีการพิจารณาขนาดภาพทั้งหมดอย่างรวดเร็วเพื่อตัดสินใจเกี่ยวกับอัตราส่วนภาพสุดท้าย:

identify png/*

ผลลัพธ์ใด:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

ดังนั้นอัตราส่วนคลาสสิก 480p (640x480 == 4/3) จึงดูเหมาะสม

ทำการแปลงหนึ่งครั้งด้วยการย่อขนาดเล็กน้อยเพื่อให้มีความกว้างเท่ากัน (TODO ทำการปรับความกว้างอัตโนมัติโดยอัตโนมัติที่นี่ฉันแค่ดูidentifyเอาต์พุตด้วยตนเองและลดความกว้างและความสูงทีละรายการ):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

สิ่งนี้ให้ผลลัพธ์ที่น่ากลัวเพราะเท่าที่เห็นจาก:

ffprobe raw.mp4

ffmpeg ใช้ขนาดภาพแรก 556x494 จากนั้นแปลงขนาดอื่นทั้งหมดเป็นขนาดที่แน่นอนทำลายอัตราส่วนภาพ

ตอนนี้เราจะแปลงภาพให้เป็นอัตราส่วนภาพเป้าหมาย 480p โดยอัตโนมัติโดยการครอบตัดตามImageMagick: วิธีการครอบตัดรูปภาพให้เล็กที่สุดเป็นอัตราส่วนกว้างยาวน้อยที่สุด?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

ดังนั้นอัตราส่วนภาพก็ดี แต่ก็ต้องมีการครอบตัดบางอย่างซึ่งจะเป็นการตัดส่วนที่น่าสนใจของภาพออก

อีกตัวเลือกหนึ่งคือใช้แผ่นรองที่มีพื้นหลังสีดำเพื่อให้มีอัตราส่วนกว้างยาวเหมือนที่แสดงที่: ปรับขนาดให้พอดีกับกล่องและตั้งพื้นหลังเป็นสีดำในส่วน "ว่าง"

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

แม้ว่าโดยทั่วไปแล้วคุณจะสามารถเลือกภาพที่มีอัตราส่วนเดียวกันหรือคล้ายกันเพื่อหลีกเลี่ยงปัญหาเหล่านั้นตั้งแต่แรก

เกี่ยวกับตัวเลือก CLI

แต่ทราบว่าแม้จะมีชื่อ-globนี้ไม่เป็นทั่วไป patters เปลือก Glob เช่น: -i '*'ล้มเหลว: https://trac.ffmpeg.org/ticket/3620 (เพราะเห็นได้ชัด filetype จะอนุมานได้จากส่วนขยาย)

-r 30ทำให้-framerate 1วิดีโอ 30 FPS เอาชนะข้อบกพร่องในผู้เล่นเช่น VLC สำหรับอัตราเฟรมต่ำ: VLC ค้างสำหรับวิดีโอ 1 FPS ต่ำที่สร้างจากภาพที่มี ffmpegดังนั้นมันจึงซ้ำแต่ละเฟรม 30 ครั้งเพื่อให้ได้ผล 1 ภาพต่อวินาทีที่ต้องการ

ขั้นตอนถัดไป

คุณจะต้อง:

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

ทดสอบแล้ว

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04

บรรณานุกรม


หากคุณใช้ python และ subprocess.call เพื่อเริ่ม ffmpeg คุณไม่ควรใช้เครื่องหมายคำพูดเดี่ยว'ในชื่ออินพุตและไฟล์เอาต์พุต มิฉะนั้นจะไม่พบไฟล์
RunOrVeith

นี่จะเป็นสิ่งที่ดีสำหรับฉัน แต่งานสร้างจากแพคเกจ npm ของฉันffmpeg-staticไม่ได้ใช้ glob ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi

-pix_fmtเกิดTrailing options were found on the commandline.ข้อผิดพลาด
Anthony Kong

@AththonyKong ฉันไม่สามารถทำซ้ำด้วยffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4ใน Ubuntun 19.10 ffmpeg 4.1.4 ตอนนี้รุ่นของคุณและคำสั่งที่แน่นอนคืออะไร?
Ciro Santilli 郝海东冠状病六四事件法轮功

20

เวอร์ชันง่าย ๆ จากเอกสาร

ใช้งานได้ดีเยี่ยมเป็นพิเศษสำหรับภาพGoogle Earth Studio :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
ไม่สามารถเล่นเอาต์พุตนี้: [h264 @ 0x7f148cc3cc40] การเร่งความเร็วฮาร์ดแวร์ล้มเหลวในการถอดรหัสภาพ
Bram

สวัสดีฉันจะดำเนินการคำสั่งนั้นฉันแค่พบว่าคุณสามารถโปรดช่วยฉันได้อย่างไร
ไร้เดียงสา

@Innocent จาก Terminal หรือ Console ของคุณ
Joshua Pinter

ทำให้เป็นคนได้ แต่โครงการ% 3d.png ไม่ได้เลือกภาพทั้งหมดของฉันในโฟลเดอร์ที่มีชื่อ Project001.png, Project002.png และอื่น ๆ ภาพ 2 รูปเท่านั้นที่ฉันควรทำเพื่อให้ได้ภาพทั้งหมดของฉันและแปลงเป็นวิดีโอ
ไร้เดียงสา

คุณกำลังใช้%3dหรือ%03d?
Joshua Pinter

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