Làm cách nào để tạo video từ hình ảnh bằng FFmpeg?


86

Có thể sử dụng ffmpegtạo video từ một tập hợp các chuỗi, trong đó số không bắt đầu từ 0?

Ví dụ: tôi có một số hình ảnh [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg] và tôi muốn chuyển đổi chúng thành video. Tôi đã thử lệnh sau, nhưng nó không hoạt động (có vẻ như số bắt đầu từ 0):

ffmpeg -i test_% d.jpg -vcodec mpeg4 test.avi

Có lời khuyên nào không?


Đã được một thời gian kể từ khi bạn hỏi điều này, nhưng nếu bạn vẫn quan tâm đến câu hỏi, câu trả lời là CÓ - Tôi đã đăng chi tiết và ví dụ bên dưới: stackoverflow.com/a/12160155/181638
Assad Ebrahim

@casperOne sẽ hữu ích khi có ý tưởng tại sao điều này không đúng chủ đề. Có vẻ như một vấn đề lập trình cụ thể. Thẻ FFmpeg có 3,7 nghìn người theo dõi và với 27 nghìn lượt xem rõ ràng mọi người thấy nó hữu ích ..
geotheory

2
@geotheory Các thống kê thẻ không liên quan. ffmpeg là một chương trình theo cách nói của WinRar. Mặc dù bạn có thể lập trình chống lại các thư viện trong ffmpeg , nhưng câu hỏi này không phải là về điều đó. Sử dụng ffmpeg từ dòng lệnh sẽ được hỏi trên Super User , trong đó có chủ đề.
casperOne

Câu trả lời:


81

Không cần đổi tên tập tin nếu sử dụng -start_numberkhóa chuyển như vậy:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

đâu nlà điểm bắt đầu của chuỗi ảnh tĩnh.

Lưu ý, điều này sẽ hoạt động miễn là chuỗi không bị gián đoạn khi nó bắt đầu. Nếu có những khoảng trống và bạn muốn tất cả các ảnh tĩnh được bao gồm, thì việc đánh số lại có thể là cần thiết để lấp đầy các khoảng trống.

Có một số công tắc khác bạn có thể thấy hữu ích.

Tôi sử dụng một lớp lót sau để có tốc độ khung hình chậm hơn và nén hình ảnh và có video kết quả nhỏ hơn:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

Các -r 3tùy chọn thiết lập tốc độ khung hình của video tạo ra tới 3 khung hình mỗi giây để tôi có thể gặp nhau vẫn cho một khoảng thời gian ngắn. Các -stùy chọn lại tỷ lệ chia hình ảnh với độ phân giải mong muốn để quản lý kích thước của video kết quả.

(Trong vỏ Windows, thay thế -i Imgp%04d.jpgbằng -i "Imgp%%04d.jpg". Tín dụng cho Mike Fitzpatrick https://superuser.com/a/344178/153054 )


4
sự khác biệt giữa -r và -framate là gì?

1
chúng giống nhau IIRC
rogerdpack

22
Không cần đánh số vô nghĩa, miễn là bạn vui lòng chấp nhận thứ tự chúng xuất hiện trong (giả sử) 'ls' ... chỉ cần sử dụng: ffmpeg -potype_type global -i '* .jpg' movie.mp4
Orwellophile

2
Có bất kỳ công tắc nào để kiểm soát khoảng cách thời gian giữa các hình ảnh, giả sử, tôi muốn hiển thị hình ảnh đầu tiên 13, 15 giây, 24 giây cho thứ ba, khoảng cách thời gian được người dùng xác định, điều đó có khả thi không?
zionpi


38

bạn có thể sử dụng đoạn mã dưới đây:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

Điều này không xoay JPG đến xoay được nêu trong siêu dữ liệu.
Erik Johansson

17

Bạn có thể tìm thấy một tập lệnh mẫu trong tài liệu ffmpeg :

3.2 Làm cách nào để mã hóa các ảnh đơn thành phim?

Nếu bạn có số lượng lớn hình ảnh để đổi tên, bạn có thể sử dụng lệnh sau để giảm bớt gánh nặng. Lệnh, sử dụng cú pháp shell bourne, liên kết một cách tượng trưng tất cả các tệp trong thư mục hiện tại khớp * jpg với /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg', v.v.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Sau đó chạy:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

2
Bạn nên tạo x = 0 để bắt đầu để tên hình ảnh bắt đầu img000.jpg vì đây là những gì ffmpeg mong đợi. Ngoài ra, symlinking không hoạt động với tôi vì ffmpeg không thể tìm thấy các tập tin nên tôi phải sử dụng cp thay vào đó (tốc độ rõ ràng và không gian rút lại nhưng sau đó tôi vẫn xử lý chúng). mv cũng sẽ hoạt động nếu bạn không mất bản gốc.

Lưu ý rằng trong câu trả lời này, lệnh được cung cấp sẽ tạo liên kết cứng chứ không phải liên kết tượng trưng. Về việc sử dụng cpnếu liên kết không hoạt động, nếu hệ thống tập tin của bạn hỗ trợ, nó cp --reflink=autosẽ đạt được tốc độ sử dụng / không gian tốt hơn nhiều.
Félix Saparelli

12

Từ tài liệu của ffmpeg:

Sử dụng mô hình toàn cầu

ffmpeg cũng hỗ trợ tính năng tạo kiểu bash (* đại diện cho bất kỳ số lượng ký tự nào).

Điều này hữu ích nếu hình ảnh của bạn là tuần tự nhưng không nhất thiết phải theo thứ tự tuần tự số như trong các ví dụ trước.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Vì vậy, miễn là các tệp của bạn được sắp xếp, sử dụng công -pattern_type globtắc sẽ phù hợp với bạn.


Lưu ý rằng quả cầu này bị giới hạn hơn so với các khối vỏ thông thường: trac.ffmpeg.org/ticket/3620 rõ ràng vì loại hình ảnh được suy ra từ tiện ích mở rộng.
Ciro Santilli 新疆 心 心 事件

11

Theo như tôi biết, bạn không thể bắt đầu chuỗi theo số ngẫu nhiên (tôi không nhớ bạn nên bắt đầu từ 0 hay 1), ngoài ra, nó không thể có khoảng trống, nếu có, ffmpeg sẽ cho rằng chuỗi đã kết thúc và ngừng thêm hình ảnh.

Ngoài ra, như đã nêu trong các nhận xét cho câu trả lời của tôi, hãy nhớ rằng bạn cần chỉ định độ rộng của chỉ mục của mình. Như:

hình ảnh% 03d.jpg

Và nếu bạn sử dụng loại chỉ mục% 03d, bạn cần đệm tên tệp của mình bằng 0, như:

image001.jpg image002.jpg image003.jpg

Vân vân.


1
Nếu tên tệp hình ảnh có các số 0 đứng đầu thì chuỗi định dạng cũng phải chỉ định chiều rộng như "% 03d".

1
Nếu đó là trở ngại duy nhất, bạn chỉ có thể viết một tập lệnh để đổi tên hoặc liên kết hình ảnh của bạn thành một bộ được giới thiệu lại đúng cách.
Cascabel

1
Có, tôi đã làm việc với điều này trước đây, tôi đã viết một trình bao bọc trong Ruby cách đây một thời gian nơi bạn gọi là instance.addImage (), sau đó là. và tạo video. Nó khá dễ dàng.

@Jefromi Tôi đã tạo một symlink nhưng làm cách nào để cung cấp đường dẫn của tệp symlink cho ffmpeg? Nó chỉ giả sử tập tin symlink là hình ảnh tôi đang cố gắng chuyển đổi? Tôi đang trên win7 btw

Trình tự có thể bắt đầu bất cứ nơi nào từ 0 đến 4.
Assad Ebrahim

5

Tôi đồng ý với Francisco, nhưng như một cách giải quyết, bạn chỉ cần viết một tập lệnh nhanh để di chuyển hoặc tạo các liên kết tượng trưng đến các tệp có số thứ tự mà ffmpeg cần. Tập lệnh sau đó có thể gọi ffmpeg và sau đó xóa các liên kết hoặc di chuyển các tệp trở lại vị trí ban đầu của chúng.


1

tra cứu

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1

Tôi biết đây là một câu hỏi cũ nhưng tôi đã tìm thấy nó trong Google trong khi tìm kiếm cùng một câu trả lời. Không có câu trả lời nào ở đây làm tôi hài lòng hoàn toàn vì vậy tôi đã tìm kiếm và đọc nhiều hơn và đây là một lệnh mà tôi đã đưa ra cho vấn đề của riêng mình.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

Lý do tại sao tôi sử dụng một lệnh như thế này là ...

  1. Cat và -f image2pipe cung cấp cho bạn quyền kiểm soát tốt hơn đối với những hình ảnh bạn sử dụng. Ví dụ, nó cho phép bạn sử dụng các tính năng bash như mở rộng khung và các lệnh khác như grep để tinh chỉnh kết quả mà bạn nên chọn.
  2. Ít chuyển đổi để nhớ.
  3. Tôi khuyên bạn KHÔNG nên sử dụng -r và thay vào đó chỉ sử dụng -framerator. Theo kinh nghiệm của tôi -r có xu hướng giảm khung thường xuyên hơn.
  4. Ít phức tạp hơn, không có các công tắc không cần thiết trong sử dụng và nó sẽ hoạt động như bình thường. Bạn có thể thêm độ phức tạp (ví dụ: chỉ định bộ mã hóa) và tinh chỉnh cho phù hợp với nhu cầu của bạn.

Đối với câu hỏi của OP, -start_numberlà tất cả những gì cần thiết.
Gyan

0

Tôi đã sử dụng bộ mã hóa flv vì video của tôi đang ở trong trình phát flash (Jwplayer)

ffmpeg -i% d.jpg -vcodec flv test.flv


0

Từ tài liệu , có vẻ như bạn chỉ cần sử dụng *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Lưu ý, để cải thiện ảnh hưởng đến chất lượng, tốc độ / khung hình / giây có thể quan trọng (ví dụ: đầu tiên chỉ định tốc độ khung hình rất thấp / cao và sau đó chuyển từ bộ lọc thứ hai sẽ khiến video chuyển động chậm trở lại bình thường?)


0

Trong trường hợp của tôi, nó phức tạp hơn một chút vì các số trong tệp. Đây là hình ảnh của tôi như thế nào:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

và đây là lệnh tôi đã sử dụng:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi

0

Bạn có thể làm điều này với convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

Nếu bạn muốn sử dụng ffmpeg, tôi đã sử dụng

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

trong đó 10*PTSnói với ffmpeg để làm chậm nó 10 lần. Bạn cũng có thể có phân số ở đó để tăng tốc nó.


Đây chỉ là nội suy chuỗi hình ảnh gốc của bạn sang một không gian mới, nó không tạo ra một tệp video như OP yêu cầu.
f0ster 18/03/2016

0

-pattern_type glob ví dụ cụ thể với âm thanh

Tùy chọn này đã được đề cập tại: https://superuser.com/a/782520/128124 nhưng đây là một vài ví dụ cụ thể về cách sử dụng của nó, bao gồm thêm âm thanh vào video đầu ra.

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 nó, cắt khi âm thanh 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ân vân

Xem thêm: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

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

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: Làm cách nào để chuyển đổi MP3 sang định dạng video được Youtube cho phép?

Có được một số hình ảnh đầu vào thử nghiệm tổng hợp

Đây là những hình ảnh thử nghiệm tôi đã sử dụng trong câu trả lời này:

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: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

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

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 lỗi trong những người chơi như VLC cho tốc độ khung hình thấp: https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-USE- ffmpeg / 41797724 # 41797724 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 từ dòng lệnh:

Đã thử nghiệm trên

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Thư mục

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.