สร้างวิดีโอที่มี 5 ภาพที่มีเอฟเฟกต์ fadeIn / out ใน ffmpeg


27

ด้วย 5 ภาพฉันต้องสร้างวิดีโอ 60 วินาทีใน ffmpeg แต่ละภาพต้องแสดงเป็นเวลา 15 วินาที หลังจาก 15 วินาทีภาพแรกจะจางหายไปและภาพที่ 2 ต้องจางหายไปหลังจากที่ภาพที่ 2 ต้องจางหายไปภาพที่ 3 จะจางหายไปใน .. เป็นต้น กรุณาแนะนำฉันว่าฉันจะบรรลุสิ่งนี้ได้อย่างไรโดยใช้คำสั่ง ffmpeg


4
คุณลองทำอะไรแล้วเราสามารถช่วยคุณได้ ฟอรัมนี้ไม่ใช่ประเภทของ "โปรดให้คำตอบโดยไม่ต้องทำงานใด ๆ " ของฟอรัม จากที่กล่าวมาฉันจะให้ลิงก์ไปยังเอกสาร ffmpeg fade - ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio

คำตอบ:


49

จุ่ม / จางเป็นสีดำ

เลื่อนลงเพื่อดูวิธีการ crossfade

ตัวอย่างจางหาย

ตัวอย่างที่ภาพแต่ละภาพแสดงเป็นเวลา 5 วินาทีและแต่ละภาพมีสีซีดจางนาน 1 วินาที อินพุตของภาพแต่ละรายการมีความกว้างความสูงและอัตราส่วนตัวอย่างที่เท่ากัน หากขนาดแตกต่างกันโปรดดูตัวอย่าง # 3 ด้านล่าง

เอาต์พุต MP4

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

พร้อมเสียง

เหมือนด้านบน แต่มีเสียง:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

สำหรับภาพอินพุตที่มีขนาดแตกต่างกันหรือขนาดใดก็ได้

เช่นเดียวกับตัวอย่างแรก แต่ด้วยภาพอินพุตที่เปลี่ยนแปลงในความกว้าง x ความสูง พวกเขาจะได้รับเบาะให้พอดีกับภายในกล่อง 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

ดูตัวอย่างในการปรับขนาดวิดีโอให้พอดีกับเครื่องเล่นขนาดคงที่หากคุณต้องการครอบตัด (เติมหน้าจอ) แทนที่จะเป็นแผ่น (กล่องจดหมาย / เสาหลัก) หรือหากคุณต้องการป้องกันการลดอัตราการสุ่ม

เอาท์พุท GIF

เพิ่มตัวกรองจากฉันจะแปลงวิดีโอเป็น GIF โดยใช้ ffmpeg ด้วยคุณภาพที่เหมาะสมได้อย่างไร

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

ใช้-loopตัวเลือกเอาต์พุตเพื่อควบคุมจำนวนครั้งที่ลูป GIF ค่าเริ่มต้นคือการวนซ้ำไม่สิ้นสุดหากไม่ได้ใช้ตัวเลือกนี้ ค่าของ-1คือไม่วนซ้ำ

ตัวเลือกและตัวกรองที่ใช้:

  • -t เพื่อตั้งระยะเวลาเป็นวินาทีของอินพุตแต่ละรายการ

  • -loop 1 ลูปภาพมิฉะนั้นจะมีระยะเวลา 1 เฟรม

  • -framerateเพื่อตั้งค่าอัตราเฟรมภาพอินพุต (ค่าเริ่มต้นเมื่อไม่ได้ประกาศคือ 25) มีประโยชน์สำหรับการสร้าง GIF

  • สเกลที่มีแผ่นอิเล็กโทรดเพื่อให้พอดีกับภาพที่นำเข้ามาในขนาดที่เฉพาะและสม่ำเสมอ (ใช้ในตัวอย่างที่ 3)

  • จางหายไปเข้าและออก dคือระยะเวลาของการจาง stคือเมื่อมันเริ่ม

  • concat to concatenate (หรือ "เข้าร่วม") แต่ละภาพ

  • ฟอร์แมตเพื่อเอาท์พุทชุดรูปแบบการสุ่มของ Chroma ที่เข้ากันได้กับผู้เล่นที่ไม่ใช่ FFmpeg หากส่งออก MP4 และเข้ารหัสด้วย libx264 (ตัวเข้ารหัสเริ่มต้นสำหรับเอาต์พุต MP4 หากสนับสนุนโดยบิลด์ของคุณ)

  • แยกเพื่อทำสำเนาของเอาต์พุตตัวกรอง ต้องการโดยตัวกรอง palette * เพื่อทำทุกอย่างในคำสั่งเดียว

  • palettegenและpaletteuseสำหรับการทำ GIF ที่ดูดี


Crossfade

ตัวอย่าง crossfade

ตัวอย่างที่ภาพแต่ละภาพแสดงเป็นเวลา 5 วินาทีและแต่ละภาพมีรูปกากบาทที่มีความยาว 1 วินาที อินพุตของภาพแต่ละรายการมีความกว้างความสูงและอัตราส่วนตัวอย่างที่เท่ากัน หากขนาดแตกต่างกันให้ปรับตัวอย่าง # 3 ด้านบน

เอาต์พุต MP4

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

พร้อมเสียง

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

ข้ามระหว่างสองวิดีโอพร้อมเสียง

เลือกเซ็กเมนต์ 5 วินาทีจากแต่ละอินพุตและเพิ่ม crossfade 1 วินาที:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

เอาท์พุท GIF

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

ใช้-loopตัวเลือกเอาต์พุตเพื่อควบคุมจำนวนครั้งที่ลูป GIF ค่าเริ่มต้นคือการวนซ้ำไม่สิ้นสุดหากไม่ได้ใช้ตัวเลือกนี้ ค่าของ-1คือไม่วนซ้ำ


1
@ LordNeckbeard ขอบคุณสำหรับคำตอบนี้ฉันใช้มันเป็นตัวอย่างอื่น ฉันเข้าใจดีว่าจำนวนที่ตามมา-tในการ-loop 1 -t 1 -i 001.pngกำหนดระยะเวลาของแต่ละเฟรมและตัวเลขที่ตามมาT/ในfilter_complexบล็อกกำหนดระยะเวลาของช่วงการเปลี่ยนภาพหรือไม่ และระยะเวลาของเฟรมในตัวอย่างนี้นับรวมถึงระยะเวลาของช่วงการเปลี่ยนภาพหรือไม่
cincplug

1
@Nisarg ที่ดูเหมือนจะไม่เป็นผลลัพธ์ที่สมบูรณ์และฉันไม่แน่ใจว่าคำสั่งมันมาจากสองที่คุณแสดงก่อนหน้านี้ -preset ultrafastอย่างไรก็ตามลองเพิ่ม
35416 llogan

1
@ LordNeckbeard ฉันต้องรวมชุดของภาพวิดีโอคลิปและแทร็กเสียงเพื่อสร้างไฟล์วิดีโอเดียว (โดยเฉพาะอย่างยิ่ง ogg แต่ที่เกี่ยวข้องน้อยกว่า ณ จุดนี้) นอกจากนี้ฉันต้องสร้างเอฟเฟกต์การเปลี่ยนแปลงระหว่างรูปภาพที่อยู่ติดกัน มีวิธีสคริปต์สคริปต์งานทั้งหมดนี้โดยใช้ ffmpeg และ / หรือเครื่องมือบรรทัดคำสั่งอื่น ๆ ? เป้าหมายคือการทำให้ภารกิจผ่านอินเตอร์เฟสบรรทัดคำสั่งโดยอัตโนมัติ
ผู้ใช้เว็บ

1
@WebUser meltเปลี่ยนอาจจะเป็นไปได้ง่ายขึ้นโดยใช้
llogan

2
วิธีการ ffmpeg ทำงานได้ดีสำหรับฉัน ขอบคุณ! หนึ่งเคล็ดลับสำหรับผู้มาใหม่ไปยังหน้า; ในconcat=n=9ส่วนของคำสั่งที่9มาจาก 5 ภาพในตัวอย่าง + 4 การเปลี่ยนระหว่างภาพ หากคุณจัดการรูปภาพจำนวนแตกต่างกันคุณจะต้องปรับเปลี่ยนให้เหมาะสม
Jim Miller

4

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

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

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


ขออภัยสคริปต์ของคุณล้มเหลวด้วย ffmpeg 3.0.1 โดยอินพุต # 0 ถึง # 4 จะส่งคืน: "ดัชนีไฟล์ไม่ถูกต้อง 5 ในคำอธิบายตัวกรอง"
Krzysztof Bociurko

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