Kết hợp một hình ảnh + một tệp âm thanh để tạo một video bằng FFmpeg


183

Điều này khá là tầm thường, nhưng tôi không thể tìm ra cách để nó hoạt động.

Tôi muốn FFmpeg lấy một hình ảnh JPEG và một tệp âm thanh làm đầu vào và tạo một tệp video có cùng thời lượng với tệp âm thanh (bằng cách kéo dài hình ảnh tĩnh trong toàn bộ thời lượng).

Tôi không quan tâm lắm đến việc codec video nào được sử dụng cho đầu ra, nhưng điều quan trọng là tôi có thể sử dụng "copy" làm codec âm thanh (tức là sao chép luồng âm thanh mà không cần chuyển mã).

Dòng lệnh bên phải sẽ làm điều đó là gì?

Tôi đã thử:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

và cố gắng rất nhiều sự kết hợp có và không có -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1(tỷ lệ khung hình thấp giả tạo với hy vọng rằng video sẽ dài) và-f image2

Hoặc tôi gặp lỗi hoặc tôi nhận được một tệp video có thời lượng của một khung hình.

Tôi đã đi vòng quanh và tìm thấy hàng tá giải pháp được đề xuất (được cho là cho cùng một câu hỏi này) không có giải pháp nào trong số đó hoạt động.

Bất cứ ai có thể đề nghị một lệnh làm việc và giải thích lý do đằng sau nó?


Tôi vừa thử dòng lệnh của bạn và nó hoạt động như mong đợi. Vấn đề của bạn có thể nằm ở định dạng âm thanh. Liệu chuyển mã âm thanh có hoạt động không?
Thuyền trưởng hươu cao cổ

Bởi "như mong đợi", bạn có nghĩa là video kết quả có cùng thời lượng với đầu vào âm thanh? Bạn đã chơi nó chưa? Nó không dài một khung hình sao?
matteo

Định dạng âm thanh không phải là vấn đề, chuyển mã âm thanh hoạt động
matteo

Tôi đã có một lệnh của vấn đề params quá và nó làm tôi mất hàng giờ! Quá tệ những loại vấn đề này không được đề cập trong trợ giúp. gregoire.org/2009/12/05/fun-with-ffmpeg
Paul Gregoire

3
Điều này tốt hơn câu trả lời được chọn, tôi đã thử nghiệm và nó nhanh và kích thước tệp nhỏ ..ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Muhammad Umer

Câu trả lời:


145

Thứ tự của các tùy chọn trong dòng lệnh quan trọng. Các công việc sau đây cho trường hợp của tôi:

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

Trong trường hợp tổng quát hơn, ở đâu image.jpgaudio.wavlà đầu vào của bạn, bạn có thể sử dụng lệnh sau, được điều chỉnh từ wiki FFmpeg :

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

Điều này sẽ sử dụng libx264bộ mã hóa và cung cấp cho bạn khả năng nén tốt hơn so với codec MJPEG được sử dụng ở trên. Âm thanh là AAC, với ffmpegbộ mã hóa AAC tích hợp.


5
Làm thế nào mà các tập tin lại lớn hơn nhiều so với [kích thước hình ảnh] + [kích thước của tệp âm thanh]? Tôi có thể mong đợi việc nén video sẽ phát điên với một khung không đổi?
Alec Jacobson

2
Nó phụ thuộc vào codec video bạn sử dụng. Nếu bạn đang sao chép các lệnh trong ví dụ của tôi, tôi đang sử dụng mjpeg làm codec, nén từng khung riêng biệt, do đó, không có lợi thế nào trong thực tế là tất cả các khung đều bằng nhau. Ngoài ra, tôi nghĩ rằng ngay cả các codec khác cũng sẽ mã hóa lại toàn bộ khung hình một lần, tức là mọi khung hình N, vì vậy bạn sẽ nhận được một tệp nhỏ hơn nhiều nhưng vẫn lớn hơn nhiều so với kích thước của hình ảnh + âm thanh. Họ làm như vậy bởi vì (a) nếu không, bộ giải mã sẽ cần đọc toàn bộ tệp ngay từ đầu ngay cả khi bạn chỉ muốn nhảy đến khung cuối cùng và
matteo

2
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
wim

2
sử dụng ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avicông việc này tốt hơn !!!?! ??!?!
Muhammad Umer

2
Câu trả lời này hiện đang được thảo luận về meta.
DavidPostill

41

Bạn đang làm cho nó cách khó khăn hơn so với nó phải được. FFmpeg thông minh hơn nhiều so với tín dụng của bạn - nó biết rằng bạn muốn video có cùng độ dài với đoạn âm thanh của bạn.

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

Các thuộc tính chỉ bạn để xác định là input filenames, các output codecs, và output filename(mà eo đương nhiên bao gồm output container,).

Tất nhiên, thật hợp lý khi bắt đầu với một hình ảnh tĩnh có chung kích thước với video cuối cùng của bạn; nếu bạn đang sử dụng trình chỉnh sửa hình ảnh chuyên dụng thay vì chỉ định kích thước đầu ra để FFmpeg đáp ứng, bạn cần đảm bảo kích thước đầu vào của mình là số chẵn .

Kích thước đầu ra là một trong những hang-up phổ biến nhất của FFmpeg; một số codec bị hạn chế về kích thước đầu ra hơn các loại khác, nhưng không có đầu ra nào có thể có các thuộc tính chiều cao hoặc chiều rộng số lẻ.

Các pauselệnh vào cuối của tập tin batch giữ mở CLI - những cách tốt nhất để gỡ lỗi dòng lệnh của bạn là bằng cách đọc các thông báo lỗi nó tạo ra. Chúng cực kỳ cụ thể - và tài liệu tốt nhất FFmpeg có - nhưng công việc khó khăn của nhà phát triển sẽ bị lãng phí nếu bạn cho phép cửa sổ đóng trước khi bạn có thể đọc chúng.

Shell lệnh có một công tắc cmd /kduy trì một cửa sổ mở, nơi bạn có thể chạy cùng các hướng dẫn từ tập lệnh bó của bạn tại dấu nhắc lệnh.

FFmpegavconv cả hai sẽ làm cho bạn sử dụng -c:acho -acodec-c:vcho -vcodeccuối cùng, nhưng các hướng dẫn cũ hoạt động tốt trong xây dựng tôi sử dụng.

Nota Bene: Mỗi cam kết đều có idiosyncracies. Nếu dòng lệnh của bạn không thành công mà không có lý do rõ ràng, thường rất hữu ích để thử bản dựng khác - hoặc theo ngã ba đến libav , nơi các nhà phát triển tích cực nhất của FFmpeg đã hoạt động trong vài năm qua. Công cụ chuyển mã của họ đã được đổi tên thành avconv nhưng các tệp của bạn sẽ hoạt động với một trong hai.


Tôi phải sử dụng một phiên bản khác với youurs (nếu bạn đã thử lệnh của bạn và nó hoạt động như bạn mô tả), bởi vì, như tôi đã đề cập trong câu hỏi, tôi đã thử chính xác lệnh của bạn và tôi nhận được một video về thời lượng của 1 khung hình (một phần của giây), KHÔNG phải là thời lượng của tệp âm thanh. Tôi đã mong đợi nó thông minh, nhưng (trong phiên bản của tôi) nó đã chứng minh là không.
matteo

2
Này Matteo , vâng, tôi đã thực thi mã đó, và vâng, nó hoạt động như quảng cáo. Tôi chắc chắn rằng có rất nhiều nửa người sẽ bất cẩn khi đưa ra những tuyên bố như vậy mà không kiểm tra chúng, vì vậy tôi sẽ cố gắng không bị xúc phạm :) Trong một bài viết đầy đủ bên dưới, tôi sẽ cung cấp các liên kết Pastebin cho đầu ra của bảng điều khiển FFmpeg và MediaInfo dữ liệu trên các tập tin đầu vào và tập tin đầu ra cuối cùng. Các tệp đầu vào của tôi, tệp bó của tôi, tệp đầu ra của tôi nằm trên GoogleDrive nơi chúng có thể tải xuống miễn phí , nếu bạn muốn kiểm tra chúng dựa trên bản dựng FFmpeg của mình.

@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53Cả giải pháp và giải pháp @matteo của bạn đều không hiệu quả với tôi. Ngoài ra, tôi đã tải xuống các tệp của bạn từ Google Drive, nhưng nó không mang lại đầu ra như mong đợi (tệp đầu ra chỉ có màu đen chứa âm thanh). Xin hãy giúp tôi tìm ra lệnh đúng sẽ được sử dụng.
mã hóa_idiot

2
"Không có đầu ra nào có thể có các thuộc tính chiều cao hoặc chiều rộng số lẻ" Không đúng. Đặt pix_fmt thành thứ gì đó không có mẫu phụ màu, như rgb24 hoặc yuv444p, sau đó đảm bảo codec và bộ chứa hỗ trợ nó và không có giới hạn nào nữa. Liên quan đến pix_fmt, FFmpeg kém thông minh hơn; nó giả sử yuv420p (có mẫu phụ sắc độ) trừ khi bạn nói khác.
Jonathan Baldwin

Còn nhiều hình ảnh thì sao? Tôi cần hình ảnh để thay đổi tại một số thời điểm cụ thể sang hình ảnh khác. Tôi muốn có thể chỉ định chúng trên dòng lệnh với tham số thời gian cho từng cái.

36

Thậm chí dễ dàng hơn:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg sẽ cố gắng tự động chọn codec tốt nhất, tùy thuộc vào phần mở rộng của tệp đầu ra của bạn.

Cập nhật: Tôi nhận thấy YouTube gặp khó khăn khi xử lý video (bị kẹt ở mức 95%) Tôi nghĩ vì chỉ có một khung. Giải pháp tôi tìm thấy để làm cho YouTube hài lòng: thêm nhiều khung hình hơn. Ngoài ra, tôi đã thêm -acodec copyđể bảo vệ chất lượng âm thanh. Bạn cần -shortesthoặc nó vòng lặp mãi mãi. (Nó dừng ở cuối luồng ngắn nhất, là âm thanh, vì vòng lặp hình ảnh là vô hạn.) Thứ tự các tùy chọn của bạn rất quan trọng đối với tốc độ, vì các bộ lọc (và như vậy) được xử lý theo thứ tự bạn chỉ định. Nếu bạn thay đổi thứ tự của các tham số này, kết quả sẽ khác nhau đáng kể.

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

Cũng lưu ý rằng tôi đặt tốc độ khung hình hai lần, đó không phải là sự cố - tốc độ khung hình đầu tiên là cho đầu vào, thứ hai là cho đầu ra. Nếu bạn làm điều này một cách chính xác, chỉ nên có một khung hình mỗi giây của video, có nghĩa là nó mã hóa tương đối nhanh. Ngoài ra, tôi đặt độ phân giải thành 720p tại đây, điều đó có nghĩa là bạn sẽ nhận được âm thanh HD trên YouTube :-)


Ngoài ra, có thể tệp âm thanh của bạn sẽ không tương thích với bộ chứa .flv của bạn. Trong trường hợp đó, bạn chỉ nên thử một bộ chứa (đầu ra) khác, như .webm, .avi hoặc bất kỳ định dạng nào, cho đến khi bạn tìm thấy định dạng chứa tương thích với tệp âm thanh của mình.
PJ Brunet

1
Đã sử dụng điều này cho .JPG và .MP3 để làm cho MP4 - hoạt động hoàn hảo. FLV tôi tạo từ JPG / MP3 dường như không hoạt động - có thể theo cảnh báo nhận xét trước đó.

2
Phiên bản cập nhật hoạt động, dành cho Youtube. Tôi nghĩ rằng nó đã bị kẹt ở mức 95% nhưng cuối cùng nó đã hoạt động.
Basj

đã nhận được điều này: No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)... điều này hoạt động:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
NineCattoRules

Còn nhiều hình ảnh thì sao? Tôi cần hình ảnh để thay đổi tại một số thời điểm cụ thể sang hình ảnh khác. Tôi muốn có thể chỉ định chúng trên dòng lệnh với tham số thời gian cho từng cái.

14

Phiên bản làm việc cho tôi:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

Kiểm tra tùy chọn -shortestphải ở phía trước tệp đầu ra nếu không tôi gặp lỗi dưới đây:

Tùy chọn ngắn nhất (hoàn thành mã hóa trong đầu vào ngắn nhất) không thể được áp dụng cho tệp đầu vào pic.jpg - bạn đang cố gắng áp dụng tùy chọn đầu vào cho tệp đầu ra hoặc ngược lại. Di chuyển tùy chọn này trước khi tập tin thuộc về nó. Lỗi phân tích tùy chọn cho tệp đầu vào pic.jpg.


Cảm ơn vì điều đó. Hầu hết các câu trả lời khác không phù hợp với tôi (sử dụng ffmpeg trên Alps linux). Câu trả lời này có lệnh ngắn nhất làm việc hoàn hảo cho tôi.
DannyB

8

Từ trang quản trị ffmpeg:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

Như bạn đã khám phá, các tùy chọn lưu trữ phải đến trước khi chúng được áp dụng.

Đây không phải là một lỗi, tuy nhiên, chỉ là một cơ chế mà bạn có thể chỉ định những đối số không phù hợp nào áp dụng cho.


Còn nhiều hình ảnh thì sao? Tôi cần hình ảnh để thay đổi tại một số thời điểm cụ thể sang hình ảnh khác. Tôi muốn có thể chỉ định chúng trên dòng lệnh với tham số thời gian cho từng cái.

4

Điều này làm việc cho tôi

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.mp3 -acodec sao chép -vcodec libx264 video.avi

Tôi thấy vcodec libx264đã tạo các tệp nhỏ hơn nhiều so với mpjeg(10 MB chứ không phải 100 MB).


1
-shortestlà một tùy chọn đầu ra và có thể bị bỏ qua như một tùy chọn đầu vào khi bạn đang sử dụng nó.
llogan

1

Tôi đã cố gắng làm @matteo , nhưng không có âm thanh và giải pháp của @Colonel Panic hoạt động tốt nhất:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

Tôi chỉ phải thêm một đối số thời lượng tính bằng giây ( -t 10).


-shortestlà một tùy chọn đầu ra, nhưng bạn đang sử dụng nó làm tùy chọn đầu vào. Di chuyển nó trước tập tin đầu ra và bạn có thể loại bỏ -t 10, nhưng sau đó câu trả lời của bạn sẽ khá giống với những người khác.
llogan

0

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4


5
Bạn có thể giải thích làm thế nào lệnh bạn thêm vào hoạt động?
neelsg

Câu trả lời này không khác nhiều so với "câu trả lời bình luận" đơn giản khác ở đây.
llogan

0

Trong trường hợp ai đó muốn chuyển đổi hàng loạt chúng, hãy thử điều này.

Bạn có thể đặt Thư mục đầu vào và đầu ra, cũng như định dạng mà bạn muốn video nằm trong. Trong trường hợp này tôi đặt nó thành AVI.

Câu trả lời này Kết hợp một hình ảnh + một tệp âm thanh để tạo một video bằng FFmpeg đã giúp tôi rất nhiều.

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD

-1

Hãy thử lệnh này. Nó được làm việc cho tôi.

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"

2
Đây là một lệnh không đầy đủ mà không thể làm việc. Mặc dù tôi có thể sửa và gỡ lỗi lệnh của bạn, tôi sẽ không làm việc cho bạn, vì vậy vui lòng chỉnh sửa câu trả lời của bạn và tự sửa nó. Tôi cũng nhận thấy rằng kích thước video của bạn không phải là những gì matteo muốn.
karel
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.