Làm cách nào để tạo video từ hình ảnh với FFmpeg?


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

Dòng này hoạt động tốt nhưng tôi muốn tạo một tệp video từ hình ảnh trong một thư mục khác. Tên hình ảnh trong thư mục của tôi là:

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

Làm thế nào tôi có thể nhập tập tin hình ảnh từ một thư mục khác? Thí dụ:C:\mypics

Tôi đã thử lệnh này nhưng chỉ ffmpegtạo một video có hình ảnh đầu tiên (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

Câu trả lời:


167

Xem phần Tạo trình chiếu video từ hình ảnh - FFmpeg

Nếu video của bạn không hiển thị các khung chính xác Nếu bạn gặp sự cố, chẳng hạn như hình ảnh đầu tiên bị bỏ qua hoặc chỉ hiển thị cho một khung hình, sau đó sử dụng bộ lọc video fps thay vì -r cho tốc độ khung hình đầu ra

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

Ngoài ra, bộ lọc video định dạng có thể được thêm vào chuỗi bộ lọc để thay thế -pix_fmt yuv420p như "fps = 25, format = yuv420p" . Ưu điểm của phương pháp này là bạn có thể kiểm soát bộ lọc nào đi trước

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

Tôi đã thử nghiệm các thông số dưới đây, nó làm việc cho tôi

"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

Các tham số bên dưới cũng hoạt động nhưng nó luôn bỏ qua hình ảnh đầu tiên

"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

tạo video từ hình ảnh được đặt trong các thư mục khác nhau

Đầu tiên, thêm đường dẫn hình ảnh vào imagepaths.txt như bên dưới.

# 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'

Sử dụng mẫu như sau;

"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"

tham số -safe 0 ngăn chặn lỗi tên tệp không an toàn

Liên kết liên quan

FFmpeg tạo video từ hình ảnh được đặt trong các thư mục khác nhau

FFMPEG Một hướng dẫn trung gian / chuỗi hình ảnh

Kết hợp - FFmpeg


"Nếu video của bạn không hiển thị khung chính xác Nếu bạn gặp sự cố, chẳng hạn như hình ảnh đầu tiên bị bỏ qua hoặc chỉ hiển thị cho một khung hình, thì hãy sử dụng bộ lọc video fps thay vì" Xin lỗi nhưng bạn có thể giải thích ý của bạn bằng "fps bộ lọc video "chính xác?
arnuschky

3
Theo như tôi biết thì tham số của Google là tốc độ khung hình thay đổi, điều này có nghĩa là FFMPEG có thể giảm hoặc nhân đôi khung hình để đạt được tốc độ khung hình đầu ra mong muốn. Sử dụng bộ lọc fps -vf fps = value Lực lượng FFMPEG để tạo ra tốc độ khung hình không đổi. Xem Tạo trình chiếu video từ hình ảnh - FFmpeg và đây là điểm khác biệt (kỹ thuật) giữa -r và bộ lọc fps? . Vì vậy, sử dụng tham số -r đôi khi bỏ qua hình ảnh đầu tiên ..
khan

Lệnh đầu tiên trong danh sách này ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4, dường như hoạt động nhưng cuối cùng dẫn đến một video không thể đọc được bởi bất kỳ người chơi nào (trên Ubuntu). VNC nói, "không tìm thấy nguyên tử moov". Cố gắng khắc phục điều này với qt-faststartlỗi đã tạo ra "nguyên tử cuối cùng trong tệp không phải là nguyên tử moov"
sh37211

147

-pattern_type glob

Tùy chọn tuyệt vời này giúp bạn dễ dàng chọn ảnh hơn trong nhiều trường hợp.

Trình chiếu video với một hình ảnh mỗi giây

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

Thêm một số nhạc vào đó, cắt khi âm thanh có lẽ dài hơn khi hình ảnh kết thúc:

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

Đây là hai bản demo trên YouTube:

Trở thành một con hà mã và sử dụng định dạng video không có bằng sáng chế của 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

Hình ảnh của bạn tất nhiên phải được sắp xếp theo thứ tự abc, điển hình là:

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

và như thế.

Trước tiên tôi cũng sẽ đảm bảo rằng tất cả các hình ảnh được sử dụng có cùng tỷ lệ khung hình, có thể bằng cách cắt xén chúng với imagemagickhoặc danh nghĩa trước đó, để ffmpeg sẽ không phải đưa ra quyết định khó khăn. Cụ thể, chiều rộng phải chia hết cho 2, nếu không, chuyển đổi không thành công với: "chiều rộng không chia hết cho 2".

Video tốc độ bình thường với một hình ảnh trên mỗi khung hình ở 30 FPS

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

Đây là những gì nó trông giống như:

GIF được tạo bằng: https://askubfox.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Thêm một số âm thanh cho nó:

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

Kết quả: https://www.youtube.com/watch?v=HG7c7lldhM4

Đây là những phương tiện thử nghiệm tôi đã sử dụng: a

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

Hình ảnh được tạo bằng: Cách sử dụng GLUT / OpenGL để kết xuất thành tệp?

Thật tuyệt khi quan sát xem video nén theo cách thứ tự hình ảnh tốt hơn ZIP bao nhiêu vì nó có thể nén trên các khung bằng các thuật toán chuyên dụng:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7,3 triệu

Chuyển đổi một tệp nhạc thành video có hình ảnh cố định để tải lên YouTube

Đã trả lời tại: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Thiết lập nghiên cứu trường hợp trình chiếu thực tế đầy đủ từng bước

Có nhiều hơn một chút để tạo trình chiếu hơn là chạy một lệnh ffmpeg duy nhất, vì vậy đây là một ví dụ chi tiết thú vị hơn lấy cảm hứng từ dòng thời gian này .

Nhận phương tiện đầu vào:

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

Bây giờ chúng tôi đã xem xét nhanh tất cả các kích thước hình ảnh để quyết định tỷ lệ khung hình cuối cùng:

identify png/*

đầu ra nào:

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

vì vậy tỷ lệ khung hình 480p (640x480 == 4/3) cổ điển có vẻ phù hợp.

Thực hiện một chuyển đổi với thay đổi kích thước tối thiểu để tạo độ rộng đồng đều (TODO tự động hóa cho bất kỳ chiều rộng nào, ở đây tôi chỉ xem thủ công identifyđầu ra và giảm chiều rộng và chiều cao xuống một):

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

Điều này tạo ra sản lượng khủng khiếp, vì nhìn từ:

ffprobe raw.mp4

ffmpeg chỉ lấy kích thước của hình ảnh đầu tiên, 556x494, sau đó chuyển đổi tất cả những cái khác thành kích thước chính xác đó, phá vỡ tỷ lệ khung hình của chúng.

Bây giờ, hãy tự động chuyển đổi hình ảnh sang tỷ lệ khung hình 480p mục tiêu bằng cách cắt xén theo ImageMagick: làm cách nào để cắt tối thiểu hình ảnh thành tỷ lệ khung hình nhất định?

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

Vì vậy, bây giờ, tỷ lệ khung hình là tốt, nhưng chắc chắn một số cắt xén phải được thực hiện, đó là loại cắt các phần thú vị của hình ảnh.

Tùy chọn khác là đệm với nền đen để có cùng tỷ lệ khung hình như được hiển thị tại: Thay đổi kích thước để vừa với hộp và đặt nền thành màu đen trên phần "trống"

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

Nói chung, mặc dù, lý tưởng nhất là bạn sẽ có thể chọn hình ảnh có tỷ lệ khung hình giống hoặc tương tự để tránh những vấn đề đó ngay từ đầu.

Về các tùy chọn CLI

Tuy nhiên, xin lưu ý rằng mặc dù có tên, nhưng -globđiều này không chung chung như các patters vỏ Glob, ví dụ: -i '*'fail: https://trac.ffmpeg.org/ticket/3620 (rõ ràng vì filetype được suy ra từ phần mở rộng).

-r 30làm cho -framerate 1video 30 FPS để khắc phục các lỗi trong trình phát như VLC cho tốc độ khung hình thấp: VLC đóng băng cho video 1 FPS thấp được tạo từ hình ảnh với ffmpeg Do đó, nó lặp lại mỗi khung hình 30 lần để giữ hiệu ứng 1 hình ảnh mong muốn mỗi giây.

Bước tiếp theo

Bạn cũng sẽ muốn:

TODO: tìm hiểu cách cắt và ghép nhiều tệp âm thanh vào video mà không cần các tệp trung gian, tôi khá chắc chắn là có thể:

Đã thử nghiệm trên

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Thư mục


Nếu bạn đang sử dụng python và sub process.call để bắt đầu ffmpeg, bạn không nên sử dụng dấu ngoặc đơn 'trong tên tệp đầu vào và đầu ra. Nếu không nó sẽ không tìm thấy các tập tin.
RunOrVeith

Điều này sẽ rất tốt cho tôi, nhưng bản dựng của tôi từ gói npm ffmpeg-statickhông triển khai trên toàn cầu. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi

-pix_fmtgây ra Trailing options were found on the commandline.lỗi
Anthony Kong

@AnthonyKong Tôi không thể sao chép ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4trên Ubuntun 19.10 ffmpeg 4.1.4 ngay bây giờ, phiên bản và lệnh chính xác của bạn là gì?
Ciro Santilli 郝海东 冠状 病 事件

20

Phiên bản đơn giản từ Docs

Hoạt động đặc biệt tuyệt vời cho hình ảnh Google Earth Studio :

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

1
Không thể phát đầu ra này: [h264 @ 0x7f148cc3cc40] bộ tăng tốc phần cứng không thể giải mã hình ảnh
Bram

xin chào, làm thế nào tôi có thể thực hiện lệnh đó tôi chỉ đang tìm kiếm mà bạn có thể vui lòng giúp tôi không?
Vô tội

@ Vô tư Từ Terminal hoặc Console của bạn.
Joshua Pinter

hiểu rồi nhưng dự án% 3d.png đã không chọn tất cả hình ảnh của tôi trong một thư mục có tên Project001.png, Project002.png và cứ thế, nó chỉ nhận được 2 hình ảnh tôi phải làm gì để có được tất cả hình ảnh của mình và chuyển đổi nó thành video
Vô tội

Bạn đang sử dụng %3dhay %03d?
Joshua Pinter

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.