Câu hỏi Kết hợp một hình ảnh + một tệp âm thanh để tạo một video bằng FFmpeg
Điều này khá tầm thường, nhưng tôi không thể tìm cách để nó hoạt động.
Tôi muốn FFmpeg chụp một ảnh JPEG và một tệp âm thanh làm đầu vào và tạo 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 về bộ giải mã video được sử dụng cho đầu ra, nhưng điều quan trọng là tôi có thể sử dụng "sao chép" 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 phù hợp sẽ làm điều đó là gì?
Tôi đã thử:
ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi
và đã thử nhiều 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 hơn) và -f image2
Hoặc là tôi nhận được 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 đã googled xung quanh và tìm thấy một tá các giải pháp đề xuất (được cho là câu hỏi này rất giống nhau) không ai trong số đó hoạt động.
Ai có thể đề xuất một lệnh làm việc và giải thích lý do đằng sau nó?
152
2018-05-04 17:19
gốc
Các câu trả lời:
Thứ tự các tùy chọn trong dòng lệnh quan trọng. Các công trình 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.jpg
và audio.wav
là đầ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 libx264
bộ 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, được tích hợp sẵn ffmpeg
Bộ mã hóa AAC.
117
2017-12-16 14:21
Bạn đang làm nó đường khó hơn hơn thế. FFmpeg là thông minh hơn rất nhiều so với bạn cung cấp cho nó tín dụng cho - nó biết bạn muốn video có chiều dài tương tự như theo dõi â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 duy nhất bạn có để chỉ định là input filenames
, các output codecs
, và output filename
(mà eo ipso bao gồm output container
,).
Tất nhiên, bắt đầu bằng hình ảnh tĩnh có cùng 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 cho FFmpeg để đáp ứng, bạn cần phải đảm bảo kích thước đầu vào của bạn thậm chí là số.
Kích thước đầu ra là một trong những hangout phổ biến nhất của FFmpeg; một số codec bị giới hạn ở kích thước đầu ra hơn so với các codec 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 pause
chỉ huy ở cuối tập tin batch giữ CLI mở - cách tốt nhất để gỡ lỗi dòng lệnh của bạn là đọ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 FFmpeg tốt nhất có - nhưng công việc khó khăn của các nhà phát triển bị lãng phí nếu bạn cho phép đóng cửa sổ trước khi bạn có thể đọc chúng.
Lệnh shell có một công tắc cmd /k
duy trì một cửa sổ mở, nơi bạn có thể chạy cùng một hướng dẫn tương tự từ tập lệnh batch của bạn tại dấu nhắc lệnh.
FFmpeg và avconv cả hai sẽ làm cho bạn sử dụng -c:a
cho -acodec
và -c:v
cho -vcodec
cuối cùng, nhưng các hướng dẫn cũ hoạt động tốt trong các bản dựng mà tôi sử dụng.
Nota Bene: Mọi cam kết đều có tính đồng bộ hóa. Nếu dòng lệnh của bạn không thành công vì không có lý do rõ ràng, thì việc thử một công cụ xây dựng khác - hoặc theo 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 avconv nhưng các tệp lô của bạn sẽ hoạt động với một trong hai tệp.
32
2018-05-26 02:09
Thậm chí dễ dàng hơn:
ffmpeg -i ep1.png -i ep1.wav ep1.flv
FFmpeg sẽ cố gắng chọn codec tốt nhất tự động, tùy thuộc vào phần mở rộng của tập tin đầ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 hình. Giải pháp mà tôi thấy là 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 -shortest
hoặc nó lặp lại 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à một tai nạn - 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 thiết lập độ phân giải 720p ở đây, có nghĩa là bạn sẽ nhận được âm thanh HD trên YouTube :-)
28
2018-01-28 20:16
Phiên bản làm việc cho tôi:
ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4
Thanh toán tùy chọn -shortest
phải ở phía trước tệp đầu ra nếu tôi không nhận được lỗi dưới đây:
Không thể áp dụng tùy chọn ngắn nhất (kết thúc mã hóa trong đầu vào ngắn nhất) cho tệp đầu vào pic.jpg - bạn đang cố áp dụng tùy chọn nhập vào tệp đầu ra hoặc ngược lại. Di chuyển tùy chọn này trước khi nó thuộc về.
Lỗi phân tích cú pháp các tùy chọn cho tệp đầu vào pic.jpg.
13
2018-05-22 00:40
Từ trang web ffmpeg:
ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...
Khi bạn phát hiện ra, các tùy chọn infile phải đến trước khi infile mà họ á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 đối số infile nào áp dụng cho nó.
7
2018-04-15 22:15
Điều này làm việc cho tôi
ffmpeg -loop 1 -shortest -y -i image.jpg -i âm thanh.mp3 -acodec copy -vcodec libx264 video.avi
Tôi tìm thấy vcodec libx264
đã tạo nhiều tệp nhỏ hơn mpjeg
(10 MB thay vì 100 MB).
4
2017-09-18 11:44
Tôi đã cố gắng làm như @matteonhưng không có âm thanh và @Colonel Panic's giải pháp làm việc 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 đối số thời lượng tính bằng giây (-t 10
).
1
2017-07-22 12:15