Làm rõ cho tùy chọn đầu vào ffmpeg với các tệp hình ảnh làm đầu vào


34

Tôi có một số hình ảnh và tôi muốn tạo một gif hoạt hình với ffmpeg. Các hình ảnh có tên là:

837_1.png
838_1.png
...

Tôi đang cố gắng để không hiểu tùy chọn dòng lệnh -i của ffmpeg nhưng tôi đang gặp phải một số vấn đề.

Nếu tôi không chỉ định bất cứ điều gì, nó sẽ yêu cầu tôi thay thế các tệp:

ffmpeg -i * -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '358_1.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 550x550, 25 tbr, 25 tbn, 25 tbc
File '359_1.png' already exists. Overwrite ? [y/N]

Và nếu tôi cố gắng sử dụng một trong những định dạng được sử dụng nhiều nhất (% d) trên internet .. ffmpeg không tìm thấy các tệp:

fmpeg -i '%3d_1.png' -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[image2 @ 0x7f963a006600] Could find no file with with path '%3d_1.png' and index in the range 0-4
%3d_1.png: No such file or directory

Vì vậy, đây là câu hỏi, làm thế nào để sử dụng tùy chọn dòng lệnh -i với ffmpg?

Để rõ ràng, tôi đang dùng Mac OSX 10.8, phiên bản ffmpeg 1.2.1, zsh 4.3.11

Câu trả lời:


47

Nếu không có thêm tùy chọn nào, trình giải mã của ffmpeg image2sẽ tìm kiếm một chuỗi bắt đầu bằng 0. Nó cũng sẽ kiểm tra xung quanh chỉ số này, với phạm vi mặc định là 5 (đó là lý do tại sao nó sẽ phàn nàn về việc không có chỉ số nào trong phạm vi 0 0 4). Theo tài liệu , bạn phải đặt số bắt đầu nếu bạn muốn bắt đầu ở một chỉ số tùy ý, như 837.

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 out.mp4

Không gian màu trong chuyển đổi PNG sang H.264

Do các tệp PNG sử dụng không gian màu RGB để thể hiện các pixel, nên việc chuyển đổi sang H.264 cuối cùng sẽ là YUV 4: 4: 4 ( không được ghép mẫu ). Video kết quả có thể không phát được trên tất cả người chơi, đáng chú ý là mọi thứ không dựa trên FFmpeg. Trình phát của bạn sẽ chỉ hiển thị các khung màu đen hoặc có thể bị sập. Để khắc phục điều đó, hãy thay đổi định dạng pixel thành YUV 4: 2: 0:

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 -pix_fmt yuv420p out.mp4

Để kiểm soát chất lượng, sử dụng -crftùy chọn. Xem hướng dẫn mã hóa x264 để biết thêm thông tin.

Tại sao toàn *cầu không hoạt động

Đừng sử dụng *tùy chọn đầu vào. Shell sẽ mở rộng nó tới tất cả các tệp trong thư mục hiện tại trước khi ffmpegnhìn thấy nó, vì vậy lệnh sẽ mở rộng sang ffmpeg -i file1 file2 … filen. Vì tất cả các tệp đầu vào ffmpegcần -itùy chọn, file2 … filenthay vào đó , nó sẽ lấy các tệp đầu ra và ghi đè lên chúng. Không tốt.


câu trả lời rất đầy đủ! và bạn cũng có một số lời khuyên về gif hoạt hình?
nkint

Đối với GIF động, bạn muốn cập nhật lên phiên bản ffmpeg 2.0 trở lên, vì chúng cải thiện đáng kể chất lượng hình ảnh. Các tải trang có một số liên kết đến các tĩnh xây dựng cho OS X. Ví ffmpeg cũ, xem: cải ffmpeg .flv video sang .gif với chất lượng khủng khiếp
slhck

Trên thực tế, nó không chỉ kiểm tra + 0..4 mà còn 8,16,32,64, v.v ... Điều này rất đáng chú ý khi sử dụng url HTTP. Tuy nhiên, image2không nhận ra đó 200 OKlà tương đương với "tập tin được tìm thấy" nên nó không ngừng tìm kiếm.
MSalters

1
Tôi đang nhận được điều tương tự ngay cả sau khi cố gắng thực hiện các đề xuất của bạn. Tác phẩm của tôi được đặt tên DSCxxxxx.jpgnơi xxxxxlà một con số 5 chữ số bắt đầu với zero (lưu ý tôi không có dấu gạch dưới). Tuy nhiên, sau khi chạy, ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4tôi gặp lỗi tương tự như trong bài viết gốc ở trên
Ẩn danh

@jphollowed Bạn đã đặt mẫu tên tệp trong dấu ngoặc kép chưa?
slhck

29

Globbing có thể được kích hoạt bằng cách chỉ định -pattern_type globtùy chọn:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4

2
Cách tốt hơn nhiều :)
Gustav

3
Chỉ điều này làm việc cho tôi. Không có cách nào để có được điều này xxx%d.png, xxx%3d.png, 'xxx%d.png'hoặc 'xxx%3d.png'điều làm việc
yPhil

Tôi nhận được lỗi tương tự sau khi thử điều này:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Ẩn danh

Kiểu mẫu 'global' đã được chọn nhưng globalbing không được hỗ trợ bởi bản dựng libavformat này [sử dụng Windows ffmpeg] [oof, nên đã cuộn xuống một câu trả lời]
Katastic Voyage

7

Lưu ý: Toàn cầu hóa mô hình không hoạt động trong Windows (và có thể không bao giờ do thiếu hỗ trợ cho toàn cầu hóa trong libavfilter trong Windows.) Vì vậy, nếu bạn thực hiện việc này trong Windows, bạn sẽ phải đổi tên các tệp để chúng được đánh số liên tục và không có khoảng trống.

Bạn có thể đổi tên chúng bằng một dòng lệnh Powershell đơn giản:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }

Điều này sẽ trở lại file1.jpg file2.jpg... file10.jpgmà nếu bạn sắp xếp theo thứ tự abc sẽ kết thúc file1.jpg, file10.jpg...file2.jpg
stib

Không phải đó là Base $ x.jpg? Như vậy, của bạn đã đổi tên tất cả của tôi và giết các phần mở rộng tập tin.
Chuyến đi Katastic

5

cách tốt hơn để đổi tên bằng PowerShell (giữ trật tự):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }

dirluôn trả lại hồ sơ được sắp xếp theo thứ tự abc? Nó sẽ an toàn hơn để thêm một sort-objecthỗn hợp?
stib
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.