hình ảnh + âm thanh = mp4: làm thế nào để làm cho video nhỏ hơn?


12

Tôi đang sử dụng ffmpeg để thêm JPG vào MP4 để tạo MP4.

Vì chỉ có một hình ảnh để tạo video Tôi đang tự hỏi liệu có cách nào để giảm kích thước video không?

Chỉ huy:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Các kết quả:

  • image.jpg = 26,7K (hình ảnh không rõ ràng)
  • audio.mp3 = 64,6M (54 phút)
  • output.mp4 = 80,6M (kết quả video không quá rõ ràng, âm nhạc vẫn tốt)

Đây có phải là một kích thước hợp lý cho MP4?


Bạn có thể vui lòng gửi lệnh ffmpeg bạn sử dụng?
nực cười

Vui lòng không tạo hình ảnh của (một số) văn bản, nhưng thay vào đó sao chép và dán nó. Hình ảnh rất lớn, không thể tìm kiếm và không thể sao chép từ đó.
llogan

oops vâng thưa ngài. tôi đã đóng cửa sổ cmd, vì vậy không thể dán văn bản cho bạn ngay bây giờ: |
SIDU

Tôi tự hỏi nếu có thể meta mp4 để nó chỉ phát mp3 và giữ màn hình cố định trên một jpg để tiết kiệm kích thước :)
SIDU

Trình phát mục tiêu, thiết bị hoặc trang web cho đầu ra là gì?
khẩu hiệu

Câu trả lời:


18

Để tải lên YouTube

H.264: tập tin nhỏ nhất

Phương pháp này sử dụng libx264 để mã hóa video H.264. Nó chậm hơn phương thức sao chép luồng bên dưới, nhưng có khả năng sẽ xuất ra kích thước tệp nhỏ hơn.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Sao chép luồng: quá trình nhanh nhất

Phương pháp này chỉ truyền các bản sao (không mã hóa) hình ảnh vào thùng chứa MKV. Nó siêu nhanh, nhưng nếu kích thước quan trọng hơn phương pháp trên có thể tạo ra một tệp nhỏ hơn.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube chấp nhận bất cứ điều gì vì vậy các lệnh này sử dụng một số thủ thuật để mã hóa nhanh hơn hoặc làm cho kích thước tệp nhỏ và để giữ chất lượng cao vì YouTube sẽ mã hóa lại bất cứ điều gì bạn cung cấp. Trình phát của bạn có thể sẽ không thích nhưng YouTube thì có.

  • Trong các ví dụ này, tốc độ khung hình rất thấp được sử dụng sẽ xử lý nhanh hơn mặc định 25 khung hình / giây.


Khả năng tương thích rộng nhất cho mọi người chơi

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Điều này nên chơi trên chỉ là về bất cứ điều gì ngoại trừ các thiết bị rất cổ xưa (thay đổi -profile:v mainđể -profile:v baselinenếu đó là trường hợp).

  • Nếu đầu vào âm thanh của bạn đã là AAC thì hãy đổi -c:a aacsang -c:a copyđể tránh mã hóa lại không cần thiết.

  • Thời gian mã hóa sẽ dài hơn và kích thước tệp sẽ lớn hơn các lệnh YouTube ở trên.

  • Xem FFmpeg Wiki: H.264 để biết thêm.


Bạn có thể cung cấp một dòng mã để tạo a.jpg + a.mp3 = a.mp4 trong 1280 * 720 với khung hình / giây thấp nhất được youtube cho phép không? Ngoài ra, chỉ có một công việc, tôi có cần xóa "-loop 1" không? Cảm ơn trước.
SIDU

@SIDU Lệnh hiện có thực hiện những gì bạn yêu cầu (ngoài việc xuất MKV thay vì MP4), nhưng tôi không biết tốc độ khung hình thấp nhất được YouTube hỗ trợ là. Bạn sẽ phải thử nghiệm. Tại sao bạn yêu cầu MP4 khi bạn chỉ tải lên YouTube?
llogan

Tôi đã thử nó nhưng nó nói:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules

@NineCattoRules Khó nói mà không có thêm thông tin. Sử dụng một trang web pastebin để hiển thị ffmpeglệnh đầy đủ của bạn và đầu ra giao diện điều khiển hoàn chỉnh từ lệnh, sau đó cung cấp liên kết trong một bình luận.
llogan ngày

Cảm ơn, tôi đã cài đặt lại FFMPEG bằng kho lưu trữ mc3man và bây giờ hoạt động tốt!
NineCattoRules ngày

3

Chỉ với thông tin bạn cung cấp, đây là những gì tôi có thể nghĩ đến.

Chúng ta hãy đi từng mảnh:

Vì chỉ có một hình ảnh được thêm vào video. Tôi tự hỏi liệu có cách nào để giảm kích thước video hay không, ví dụ như tốc độ bit / giây = 1 thay vì 28?

Vì nó là một hình ảnh tĩnh, không cần phải thay đổi. cứ như vậy đi.

Những gì bạn đang nói về đó là khung hình mỗi giây (khung hình / giây) không bitrate. Và bạn đúng trong khái niệm. Chỉ cần một hình ảnh tĩnh 1 khung hình / giây sẽ không thành vấn đề.

Có phải là một kích thước hợp lý cho mp4? Có kích thước hình ảnh quan trọng rất nhiều?

Trong trường hợp này, kích thước hình ảnh sẽ không có trọng lượng đáng kể vì chúng ta đang xử lý chỉ với một hình ảnh tĩnh. Nếu đó là một video chất lượng cao thì đó là một vấn đề khác.

Tôi có nên thay đổi kích thước jpg thành 1080 * 720 và thực hiện các cài đặt bổ sung trong ffmpeg thành đầu ra là 720p (cài đặt ffmpeg sau đó là gì :)?

Độ phân giải bạn đang nói là 1280x720.

Tôi không thấy điểm trong -loop 1tùy chọn ở đây, nó sẽ chỉ làm chậm quá trình. Bạn đã sử dụng -shortestvì tập tin có nhiều hơn 1 luồng đầu vào? Nếu không thì không có lý do để sử dụng nó. Vì bạn đã sử dụng -acodec copynên tôi sẽ phải cho rằng bạn không muốn mã hóa lại.

Đối với đầu ra 720p 1fps mà không cần mã hóa lại và không chạm vào bitrate:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Đặt tên cho trường hợp nó có nhiều luồng đầu vào và bạn muốn ffmpeg hoàn thành mã hóa ở luồng ngắn nhất sau đó:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Bây giờ nếu bạn phải thay đổi bitrate (giả sử 1024k làm ví dụ);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Xem: Giới hạn tốc độ bit đầu ra

-c: a copy = Sao chép luồng âm thanh đầu vào để chúng tôi không mã hóa lại.

-b: v = Tốc độ bit được chỉ định là (không chính xác) không đổi.

-bufsize = Đó là khoảng thời gian tính toán tốc độ bit trung bình. Có nghĩa là hình ảnh chất lượng giảm thấp nhất nhưng bitrate chính xác hơn theo chỉ định trong -b: v .

-s = Kích thước thực tế của đầu ra video.

-framerator = Tốc độ khung hình đầu vào mà chúng tôi muốn rằng đầu ra sẽ sử dụng.

Lưu ý rằng nếu bạn vẫn muốn một video có kích thước nhỏ hơn tại một thời điểm, bạn sẽ phải hy sinh chất lượng để đạt được điều đó. Và các cách khác để làm điều đó liên quan đến mã hóa lại với nén mất mát.

Từ những gì bạn nói, thông tin bạn cung cấp và những gì bạn đang cố gắng tôi nghĩ có vẻ như mục tiêu của bạn là nhúng album-art vào mp3. Nếu đó là mục tiêu của bạn thì điều này sẽ phù hợp với yêu cầu của bạn hơn:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = Trình xác định siêu dữ liệu ffmpeg cho tệp đầu ra từ infile. Trong trường hợp này ( không ) siêu dữ liệu toàn cầu.

-map 0 = Luồng đầu vào 1 (âm thanh).

-map 1 = Luồng đầu vào 2 (hình ảnh).

Nếu không có gì ở đây phù hợp với yêu cầu của bạn xin vui lòng cung cấp thêm thông tin.


Xem xét sử dụng -frameratelàm tùy chọn đầu vào và loại bỏ đầu ra -r: nếu không, tốc độ khung hình đầu vào mặc định là 25 sẽ được sử dụng và sau đó ffmpegsẽ bỏ khung để đạt được -r 1. Nếu bạn chỉ khai báo tốc độ khung hình đầu vào thì đầu ra sẽ sử dụng cùng tốc độ khung hình.
llogan

Cảm ơn. Không biết điều đó. Chỉnh sửa để phản ánh những thay đổi được đề xuất.
Fenrir

Cảm ơn đã hướng dẫn. Dòng mã origianl ffmpeg của tôi là một bản sao-dán từ tìm kiếm google, mà tôi không biết cái gì là cái gì.
SIDU
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.