FFMpeg chuyển đổi hình ảnh jpeg thành video


4

Tôi đang cố gắng chụp một bộ ảnh được chụp trong khoảng thời gian 1 giây để tạo thành video timelapse. Tôi hình dung điều này sẽ dễ dàng với ffmpeg, nhưng tôi đang gặp phải các lỗi khó hiểu.

Tất cả các hình ảnh là yuv420 jpeg, được lấy từ máy ảnh Android. Chúng được lưu dưới dạng các tệp jpeg riêng lẻ trong một thư mục, chúng đều có kích thước và định dạng giống hệt nhau. Chúng được đặt tên là một chuỗi các tên gồm 7 chữ số, bắt đầu từ 0 (vì vậy "0000000.jpg" đến "0001000.jpg", là một ví dụ).

Đây là chuỗi của tôi (tên thư mục được điều chỉnh lại cho rõ ràng):

avconv -r 1 -f image2 -i %07d.jpg -vcodec libx264 -crf 18 -preset slower video.mp4

Có vẻ tuyệt vời, tôi thấy rất nhiều bài viết từ những người nói rằng làm việc cho họ.

Tuy nhiên ffmpeg cho tôi điều này (in đậm chỉ ra lỗi)

phiên bản ffmpeg 0.8.5-6: 0.8.5-1, Bản quyền (c) 2000-2012 các nhà phát triển Libav
  được xây dựng vào ngày 13 tháng 1 năm 2013 12:05:48 với gcc 4.7.2
*** CHƯƠNG TRÌNH NÀY ĐƯỢC ĐĂNG KÝ ***
Chương trình này chỉ được cung cấp để tương thích và sẽ được gỡ bỏ trong phiên bản tương lai. Vui lòng sử dụng avconv thay thế.
[mjpeg @ 0x233aea0] đọc quá 8
Đầu vào # 0, image2, từ '% 07d.jpg':
  Thời lượng: 00: 00: 00.04, bắt đầu: 0,000000, bitrate: Không áp dụng
    Luồng # 0,0: Video: mjpeg, yuvj420p, 640x480 [PAR 1: 1 DAR 4: 3], 25 tbr, 25 tbn, 25 tbc
Tệp 'video.mp4' đã tồn tại. Ghi đè? [y / N] y
[bộ đệm @ 0x233b340] w: 640 h: 480 pixfmt: yuvj420p
[libx264 @ 0x2339fa0] bằng SAR = 1/1
[libx264 @ 0x2339fa0] bằng cách sử dụng các khả năng của cpu: MMX2 SSE2Fast FastShuffle SSEMalign LZCNT
[libx264 @ 0x2339fa0] hồ sơ Chính, cấp 3.1
[libx264 @ 0x2339fa0] 264 - lõi 123 r2189 35cf912 - H.264 / MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - tùy chọn: cabac = 1 ref = 8 deblock = 1: 0: 0 analyse = 0x1: 0x131 me = umh subme = 9 psy = 1 psy_rd = 1,00: 0,00 hỗn hợpf = 0 me_range = 16 chroma_me = 1 trellis = 2 8x8dct = 0 cqm = 0 deadzone = 21,11 1 chroma_qp_offset = -2 chủ đề = 1 lát cắt_threads = 0 nr = 0 decimate = 1 xen kẽ = 0 Bluray_compat = 0 ràng buộc_intra = 0 bframes = 3 b_pyramid = 0 b_adapt = 2 b_bias = 0 b = keyint = 250 keyint_min = 25 perspectiveecut = 40 int numfresh = 0 rc_lookahead = 60 rc = crf mbtree = 1 crf = 18.0 qcomp = 0.60 qpmin = 0 qpmax = 69 qpstep = 4 ip_ratio = 1.25 aq = 1: 1.00
Đầu ra # 0, mp4, thành 'video.mp4':
  Metadata:
    bộ mã hóa: Lavf53.21.1
    Luồng # 0,0: Video: libx264, yuvj420p, 640x480 [PAR 1: 1 DAR 4: 3], q = -1--1, 25 tbn, 25 tbc
Ánh xạ dòng:
  Luồng # 0,0 -> # 0,0
Nhấn ctrl-c để dừng mã hóa
[mjpeg @ 0x233aea0] đọc quá 8
khung = 0 khung hình / giây = 0 q = 0,0 Lsize = 0kB thời gian = 10000000000.00 bitrate = 0,0kbits / s    
video: 0kB âm thanh: 0kB tiêu đề toàn cầu: 0kB muxing trên cao 610.000000%

Các dòng nhập (hiển thị màu đỏ) là những dòng có nội dung " [mjpeg @ 0x233aea0] đã đọc quá 8 ".

Điều này khiến tôi nghĩ rằng có lẽ nó đang cố đọc các hình ảnh dưới dạng jpeg chuyển động thay vì các tệp jpeg đơn giản và bằng cách nào đó đã thất bại. Tôi đã thử với / không "-f image2", với kết quả tương tự. Và tôi cũng đã thử sử dụng avconv, với kết quả tương tự.

Tôi nên lưu ý rằng các hình ảnh là hợp lệ và nếu tôi chuyển đổi tất cả chúng thành * .png (một quá trình tốn kém và mất thời gian) thì toàn bộ hoạt động. Nhưng tôi muốn chỉ có thể sử dụng jpeg mà không cần chuyển đổi trung gian. Rốt cuộc, đó là những gì ffmpeg dành cho, chuyển mã.

Có ai có cách tốt để chuyển đổi * .jpg sang video bằng ffmpeg không?


Trước hết cảm ơn bạn đã gửi đầu ra đầy đủ. Bạn không sử dụng FFmpeg, thực sự bạn đang sử dụng phiên bản "què quặt" và lỗi thời được gọi ffmpegtừ Libav (một ngã ba FFmpeg) được cung cấp cùng với Ubuntu. Thay vào đó, vui lòng sử dụng bản dựng tĩnh gần đây từ trang tải xuống của họ hoặc tự biên dịch nó , sau đó thử lại. Rất có thể là một lỗi đã được sửa chữa từ lâu. Lưu ý rằng MJPEG là tốt như bộ giải mã.
slhck

Nhân tiện: Lỗi "đọc quá mức" xuất phát từ bộ giải mã MJPEG tìm quá nhiều bit sau khi đọc khối hình ảnh theo từng khối. Cũng có thể là những hình ảnh không được định dạng đúng. Bạn có thể thử lưu lại các tệp JPG, ví dụ như với ImageMagick convert <input> <output>không?
slhck

Cảm ơn các mẹo về libav vs ffmpeg! Tôi đã chạy một máy chủ cận âm trong cùng một hộp và luôn gặp rắc rối với việc chuyển mã đúng một số tệp. Sau khi dọn dẹp avconv / libav / ffmpeg và cài đặt lại phiên bản chính thức, tất cả đã biến mất. Tuy nhiên, lỗi vẫn còn. Có thể các hình ảnh được định dạng không chính xác, nếu chúng hiển thị tốt với trình duyệt / trình chỉnh sửa hình ảnh? Tôi đang cài đặt hình ảnh khi chúng tôi nói chuyện để kiểm tra thêm
K từ

Cho rằng tôi chưa bao giờ gặp vấn đề như thế này, tôi chỉ có thể tưởng tượng chính những hình ảnh đó là thủ phạm. Nếu bạn muốn bạn có thể cung cấp cho chúng tôi liên kết đến một hoặc hai hình ảnh để kiểm tra (không thay đổi, tức là được tải lên trong một kho lưu trữ)?
slhck

Điều đó là vậy đó! Sau khi kết hợp các jpeg và nhận ffmpeg thích hợp, các khung được chuyển mã thành video giống như chúng cần. Tôi nghĩ bạn phải đã đúng về những hình ảnh được mã hóa kỳ lạ, bởi vì có một thanh màu xám nhỏ ở dưới cùng bên phải của mỗi hình ảnh, mà tôi cho rằng phải còn sót lại từ một số mã hóa không phù hợp. Nếu bạn thích, bạn có thể đăng những gì bạn nói lên câu trả lời và tôi sẽ chấp nhận nó.
K từ

Câu trả lời:


6

[mjpeg @ 0x233aea0] overread 8là một lỗi được đưa ra khi ffmpegcố gắng đọc hình ảnh JPEG (hoặc khung từ luồng MJPEG) theo từng khối, nhưng vẫn còn các bit còn sót lại.

Trong trường hợp đó, mặc dù hình ảnh của bạn có thể hiển thị tốt ở những người xem khác, nhưng đó là điều mà FFmpeg không thể (hoặc sẽ không) xử lý. Để khắc phục điều này, bạn cần lưu lại hình ảnh, dưới dạng PNG như bạn đã thử trước đây hoặc dưới dạng JPEG. Bạn có thể thực hiện loại chuyển đổi hàng loạt đó với ImageMagick , ví dụ:

for f in *.JPG; do mogrify "$f"; done

Điều này sẽ lưu lại các tệp JPEG dưới cùng tên. Lưu ý rằng bạn sẽ mất chất lượng trong quy trình đó, vì vậy nó không lý tưởng và tôi sẽ sử dụng PNG làm trung gian vì chúng không mất mát.

Nhân tiện: Luôn luôn là một ý tưởng tốt để sử dụng phiên bản FFmpeg mới nhất, mà bạn có thể tải xuống dưới dạng bản dựng tĩnh (chỉ cần tải xuống, giải nén, sử dụng) hoặc tự biên dịch . Các gói đi kèm với Ubuntu luôn lỗi thời và - tùy thuộc vào phiên bản Ubuntu của bạn - thậm chí không phải là FFmpeg "thực", mà là ngã ba Libav (rất tốt để sử dụng, nhưng người ta nên biết sự khác biệt ).

Đừng quên rằng hình ảnh cần phải có tên liên tiếp khi bạn sử dụng %07d.jpgcú pháp ffmpeg, không bỏ sót số. Xem thêm tài liệu về image2muxer để có thêm tùy chọn.


1
Tôi tin rằng bạn cũng có thể sử dụng mogrify -format jpg *.JPGthay thế cho vòng lặp for (nhưng chúng luôn hữu ích) và đối với những người khác có thể không quen thuộc mogrify(cũng xem -pathtùy chọn) sẽ ghi đè lên các tệp gốc trái ngược với convert.
llogan
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.