Chuỗi hình ảnh FFMPEG với thời lượng khác nhau


16

Giả sử tôi có một tệp mp3 có độ dài 1 phút. Và tôi có 20 hình ảnh png. Tôi muốn kết hợp những hình ảnh và âm thanh này thành một tập tin video, nhưng tôi không muốn mỗi hình ảnh kéo dài 3 giây trên màn hình, tôi muốn một số hình ảnh kéo dài 5 giây, những giây khác, v.v.

Cách duy nhất tôi có thể nghĩ là chỉ sao chép các hình ảnh sẽ tồn tại nhiều thời gian hơn, ví dụ như để có image1, image2, image3 giống hệt nhau, điều này giúp tôi có thêm 3 lần thời gian trong video.

Tuy nhiên điều này rất tốn thời gian và không gian. Có bất kỳ chuyển đổi / tham số trong ffmpeg cho phép tôi làm điều đó?


Khi bạn phát hiện ra ffmpeg sẽ hiển thị mỗi hình ảnh có cùng độ dài. Nếu bạn muốn thay đổi độ dài, bạn sẽ phải sao chép hình ảnh trước hoặc tạo các video riêng biệt của từng thời lượng mong muốn và sau đó ghép chúng lại. Có thể một số người dùng khác có ý tưởng tốt hơn, nhưng loại tác vụ này có thể dễ dàng hơn với một trình soạn thảo như
Kdenlive

Tôi đang làm nó từ tập lệnh php, vì vậy trình soạn thảo không phải là thứ tôi đang tìm kiếm.
Flot2011

Câu trả lời:


21

Sử dụng ffmpeg 2.0, có một số cách để làm điều này:

  1. Một phương pháp là sử dụng thời gian sửa đổi tập tin. Trước tiên, đặt thời gian sửa đổi của các tệp hình ảnh để mỗi tệp hình ảnh có thời gian sửa đổi lớn hơn thời gian sửa đổi trước đó; chênh lệch thời gian là thời lượng của hình ảnh trước đó (với độ phân giải 1 giây). Sau đó sử dụng tùy chọn demuxer image2 -ts_from_file 1. Ví dụ:

    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. Một phương pháp khác là sử dụng bộ giải concat , trong đó có một danh sách các tệp để nối, với thời lượng tùy chọn. Đầu tiên tạo một tệp liệt kê hình ảnh và thời lượng của bạn trông như thế này:

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

    Sau đó cung cấp tệp này làm đầu vào cho ffmpeg. Ví dụ:

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

Bạn có thể cần sao chép tệp cuối cùng sau thời lượng cuối cùng. -c:a copysao chép âm thanh mp3 nguyên trạng; nếu bạn muốn chuyển đổi nó sang một codec âm thanh khác thì bạn có thể chỉ định nó thay vì copy. Bạn cũng có thể muốn chỉ định một codec video khác với -c:vhoặc một định dạng pixel khác với -pix_fmt, chẳng hạn như -c:v libx264 -pix_fmt yuv420p. -vf fps=25sẽ làm cho tốc độ khung hình đầu ra 25 khung hình / giây. Nếu âm thanh của bạn dài hơn và bạn muốn nó bị cắt sau hình ảnh, hãy sử dụng -shortesttùy chọn.


Bất kỳ ý tưởng nào tại sao điều này dường như không hoạt động (ý tôi là, tôi đã theo tùy chọn thứ hai (và cố gắng đầu tiên) cho chữ cái nhưng nó chỉ xuất ra một video đen không có hình ảnh hoặc hình ảnh chỉ flash cho một khung hình, không phải một vài khung hình giây như được chỉ định trong tệp ffconcat.
sup

@sup: Cái này vẫn hiệu quả với tôi. Nếu video có màu đen thì trình phát của bạn có thể không hỗ trợ định dạng video bạn đang sử dụng; thử -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4thay vì out.avi hoặc thử một trình phát khác như mpv hoặc ffplay. Ngoài ra, hãy chắc chắn rằng bạn đang sử dụng phiên bản hiện tại của FFmpeg và sao chép tên tệp hình ảnh cuối cùng sau thời lượng cuối cùng.
mark4o

Hừm, lạ quá, U sử dụng mpv và bản dựng tĩnh ffmpeg được tải xuống từ ffmpeg.org, và nó chỉ bỏ qua thời lượng. Dù sao, tôi đã tìm thấy một cách khác để làm điều này, vì vậy nó không quan trọng: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup

1

Giả định ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: nội dung tệp in.ffconcat) - công việc này:

phiên bản ffconcat 1.0
tập tin text.png
thời hạn 30,0
tập tin text.png

trong khi điều này không

phiên bản ffconcat 1.0
tập tin text.png
thời hạn 30,0

tức là trong trường hợp thứ hai

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

[ĐỊNH DẠNG]
thời lượng = 0,040000
[/ĐỊNH DẠNG]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.