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


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. Chuyển mã âm thanh có hoạt động không? - Captain Giraffe
Theo "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 không? Bạn đã chơi nó chưa? Nó không dài một khung? - 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 params vấn đề quá và nó chi phí cho tôi giờ! Quá xấu các 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
đây là tốt hơn so với câu trả lời được lựa chọn, tôi đã thử nghiệm và nó nhanh và kích thước tập tin là nhỏ ..ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi - Muhammad Umer


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



Làm sao các tệp kết thúc quá lớn hơn [kích thước của hình ảnh] + [kích thước của tệp âm thanh]? Tôi mong đợi việc nén video sẽ phát điên với một khung hình không đổi? - Alec Jacobson
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 đó, nó không có lợi thế của 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 sẽ mã hóa toàn bộ khung hình một lần trong một thời gian, tức là mỗi khung hình chữ 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 âm thanh hình ảnh. Họ làm như vậy bởi vì (a) nếu không thì bộ giải mã sẽ cần phải đọc toàn bộ tệp ngay từ đầu ngay cả khi bạn chỉ muốn chuyển đến khung cuối cùng và - matteo
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
Câu trả lời này hiện đang được thảo luận trên meta. - DavidPostill♦
@matteo nhấp vào 'chỉnh sửa' dưới câu trả lời và ở góc dưới cùng bên phải sẽ có một nút có gắn nhãn 'cộng đồng bất cứ điều gì' và bạn chuyển đổi và lưu - TankorSmash


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  để 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:acho -acodec và -c:vcho -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



Tôi phải sử dụng một phiên bản khác so với youurs (nếu bạn đã thử lệnh của mình 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ử lệnh chính xác của bạn và tôi nhận được video về thời lượng của 1 khung hình (một phần nhỏ của giây), KHÔNG phải là thời lượng của tệp âm thanh. Tôi đã mong đợi nó là thông minh, nhưng (trong phiên bản của tôi) nó đã được chứng minh là không. - matteo
Hey Matteo, vâng, tôi đã thực thi mã đó, và có, nó hoạt động như được quảng cáo. Tôi chắc rằng có rất nhiều halfwits mà sẽ là bất cẩn như để làm cho tuyên bố như vậy mà không thử nghiệm chúng, vì vậy tôi sẽ cố gắng không để được xúc phạm :) Trong một bài đầy đủ dưới đây tôi sẽ cung cấp các liên kết Pastebin để FFmpeg giao diện điều khiển đầu ra và MediaInfo dữ liệu trên tệp đầu vào và tệp đầu ra cuối cùng. Các tệp nhập của tôi, tệp lô của tôi, tệp đầu ra của tôi nằm trên Google Drive, nơi chúng có thể tải xuống miễn phí, nếu bạn muốn thử nghiệm chúng với FFmpeg build của bạn.
@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53 Cả giải pháp của bạn lẫn giải pháp @matteo đều không hoạt động cho 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 đưa ra kết quả mong đợi (tệp đầu ra là màu đen chỉ chứa âm thanh). Xin hãy giúp tôi trong việc tìm ra đúng lệnh để được sử dụng. - coding_idiot
"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 sự thật. Đặt pix_fmt thành cái gì đó không có subrpling chroma, như rgb24 hoặc yuv444p, sau đó đảm bảo codec và vùng chứa hỗ trợ nó và không có hạn chế nào khác. Liên quan đến pix_fmt, FFmpeg ít thông minh hơn; nó giả định yuv420p (có chroma subsampling) trừ khi bạn nói khác đi. - Jonathan Baldwin
những gì về nhiều hình ảnh? Tôi cần hình ảnh để thay đổi tại một số thời điểm cụ thể cho một hình ảnh khác. Tôi muốn để có thể xác định chúng trên dòng lệnh với một tham số thời gian cho mỗi một.


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



Cũng có thể tệp âm thanh của bạn sẽ không tương thích với vùng chứa .flv của bạn. Trong trường hợp đó, bạn chỉ nên thử một thùng 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 vùng chứa tương thích với tệp âm thanh của mình. - PJ Brunet
Được sử dụng cho một .JPG và .MP3 để tạo một MP4 - hoạt động hoàn hảo. FLV tôi tạo từ JPG / MP3 dường như không hoạt động - điều này có thể giống như cảnh báo nhận xét trước đó.
Phiên bản cập nhật hoạt động, cho Youtube. Tôi nghĩ rằng nó đã bị mắc kẹt ở 95% nhưng cuối cùng nó đã làm việc. - Basj
hiểu rồi: 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) ... những công việc này: ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4 - NineCattoRules
những gì về nhiều hình ảnh? Tôi cần hình ảnh để thay đổi tại một số thời điểm cụ thể cho một hình ảnh khác. Tôi muốn để có thể xác định chúng trên dòng lệnh với một tham số thời gian cho mỗi một.


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



Cám ơn vì cái này. Hầu hết các câu trả lời khác didnt làm việc cho tôi (sử dụng ffmpeg trên Alpine 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


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



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


Đ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



-shortest là 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ó. - LordNeckbeard


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



-shortest là một tùy chọn đầu ra, nhưng bạn đang sử dụng nó như là một tùy chọn đầu vào. Di chuyển nó trước tệp đầ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ẽ được khá nhiều giống như những người khác. - LordNeckbeard