ลำดับภาพ FFMPEG ที่มีระยะเวลาต่าง ๆ


16

สมมติว่าฉันมีไฟล์ mp3 ความยาว 1 นาที และฉันมีภาพ 20 png ฉันต้องการรวมรูปภาพเหล่านี้และเสียงเป็นไฟล์วิดีโอ แต่ฉันไม่ต้องการให้แต่ละภาพมีระยะเวลา 3 วินาทีบนหน้าจอฉันต้องการให้รูปภาพบางรูปใช้เวลา 5 วินาทีที่ผ่านมาและอื่น ๆ 1 วินาทีเป็นต้น

วิธีเดียวที่ฉันคิดได้คือเพียงคัดลอกรูปภาพที่ควรมีเวลามากขึ้นเช่นการมี image1, image2, image3 ให้เหมือนกันทั้งหมดนี้ทำให้ฉันมีเวลาเพิ่มขึ้น 3 เท่าในวิดีโอ

อย่างไรก็ตามนี่คือเวลาและพื้นที่มาก มีสวิตช์ / พารามิเตอร์ใน ffmpeg ที่อนุญาตให้ทำเช่นนั้นหรือไม่?


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

ฉันกำลังทำจากสคริปต์ PHP ดังนั้นโปรแกรมแก้ไขจึงไม่ใช่สิ่งที่ฉันกำลังมองหา
Flot2011

คำตอบ:


21

การใช้ ffmpeg 2.0 มีสองวิธีในการทำสิ่งนี้:

  1. วิธีหนึ่งคือการใช้เวลาแก้ไขไฟล์ ขั้นแรกให้ตั้งค่าเวลาแก้ไขของไฟล์รูปภาพเพื่อให้ไฟล์รูปภาพแต่ละไฟล์มีเวลาแก้ไขมากกว่าหนึ่งไฟล์ก่อนหน้านั้น ความแตกต่างของเวลาคือระยะเวลาของภาพก่อนหน้า (ที่มีความละเอียด 1 วินาที) -ts_from_file 1จากนั้นใช้ตัวเลือกภาพที่ 2 demuxer ตัวอย่างเช่น:

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. อีกวิธีหนึ่งคือการใช้concatdemuxerซึ่งใช้รายการไฟล์ที่จะต่อกันพร้อมกับระยะเวลาเพิ่มเติม ขั้นแรกให้สร้างไฟล์ที่แสดงภาพและระยะเวลาของคุณที่มีลักษณะดังนี้:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    จากนั้นให้ไฟล์นี้เป็นอินพุตให้กับ ffmpeg ตัวอย่างเช่น:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

คุณอาจต้องทำซ้ำไฟล์สุดท้ายหลังจากระยะเวลาสุดท้าย -c:a copyคัดลอกเสียง mp3 ตามที่เป็นอยู่ copyถ้าคุณต้องการที่จะแปลงเป็นตัวแปลงสัญญาณเสียงอีกแล้วคุณสามารถระบุได้ว่าแทน นอกจากนี้คุณยังอาจต้องการที่จะระบุตัวแปลงสัญญาณที่แตกต่างกันกับวิดีโอ-c:vหรือรูปแบบพิกเซลที่แตกต่างกันด้วยเช่น -pix_fmt จะทำให้อัตราเฟรมเอาต์พุต 25 fps หากเสียงของคุณยาวขึ้นและคุณต้องการให้ตัดหลังจากภาพใช้ตัวเลือก-c:v libx264 -pix_fmt yuv420p-vf fps=25-shortest


ความคิดใด ๆ ที่ว่าทำไมสิ่งนี้ดูเหมือนจะไม่ทำงาน (ฉันหมายถึงฉันทำตามตัวเลือกที่สอง (และพยายามก่อน) เพื่อตัวอักษร แต่มันเพิ่งจะแสดงผลวิดีโอสีดำที่ไม่มีภาพหรือภาพเพียงแค่แฟลชสำหรับหนึ่งเฟรม วินาทีตามที่ระบุในไฟล์ ffconcat
sup

@sup: ยังใช้งานได้สำหรับฉัน หากวิดีโอเป็นสีดำแสดงว่าเครื่องเล่นของคุณอาจไม่รองรับรูปแบบวิดีโอที่คุณใช้ ลอง-c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4แทน out.avi หรือลองใช้เครื่องเล่นอื่นเช่น mpv หรือ ffplay ตรวจสอบให้แน่ใจว่าคุณใช้ FFmpeg เวอร์ชันปัจจุบันและทำซ้ำชื่อไฟล์รูปภาพล่าสุดหลังจากช่วงเวลาสุดท้าย
mark4o

อืมแปลกใช้ U mpv และ ffmpeg static build ที่ดาวน์โหลดจาก ffmpeg.org และมันก็ไม่สนใจระยะเวลา อย่างไรก็ตามฉันพบวิธีอื่นในการทำเช่นนี้ดังนั้นจึงไม่สำคัญ: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup

1

ทะลึ่ง ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: เนื้อหาไฟล์ in.ffconcat) - ใช้งานได้:

ffconcat เวอร์ชั่น 1.0
ไฟล์ข้อความ. png
ระยะเวลา 30.0
ไฟล์ข้อความ. png

ในขณะนี้ไม่ได้

ffconcat เวอร์ชั่น 1.0
ไฟล์ข้อความ. png
ระยะเวลา 30.0

เช่นในกรณีที่สอง

ffprobe out.avi -show_entries format=duration -v 0

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