Làm cách nào để giảm mẫu 4k xuống 1080p bằng cách sử dụng ffmpeg trong khi vẫn duy trì chất lượng?


20

Tôi có một số cảnh quay 4K 3840x2160 ở định dạng MP4 mà tôi cần để giảm xuống 1080p. Tôi đã thử chạy

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

nhưng kết quả là chất lượng rất kém, với toàn bộ hình ảnh được tạo thành từ các "ô vuông" như thể tôi đang phóng to 4: 1.

Đây là đầu ra của việc chạy lệnh này:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

Tôi biết từ kinh nghiệm rằng ffmpeg là một công cụ tuyệt vời, vì vậy tôi phải làm rối tung các tùy chọn / tham số bằng cách nào đó ...

Tôi có thể làm cái này như thế nào?


Vui lòng hiển thị đầy đủ, đầu ra giao diện điều khiển đầy đủ từ lệnh của bạn. Bạn chỉ có thể mã hóa một đoạn ngắn, vì vậy hãy thêm -t 10để tạo đầu ra 10 giây. Tại sao bạn muốn giảm giá? Trường hợp sử dụng cho đầu ra tỷ lệ của bạn là gì? Thông tin này sẽ giúp tôi cung cấp một câu trả lời chính xác hơn.
llogan

@LordNeckbeard Tôi vừa thêm đầu ra giao diện điều khiển. Tôi muốn thu nhỏ để tôi có thể dễ dàng chia sẻ các clip này với những người đang làm việc với tôi.
lara michaels

1
Đừng quên -c:a copy, vì bạn không muốn hoặc không cần mã hóa lại luồng âm thanh. Sử dụng -map 0để sao chép bất kỳ siêu dữ liệu chương hoặc nội dung khác. (ffmpeg chỉ mất 1 vid + 1 aud theo mặc định.)
Peter Cordes

1
Ngoài ra, -sws_flags lanczos+print_infosẽ sử dụng một thuật toán tỷ lệ tốt hơn so với mặc định (song song tôi nghĩ). Câu trả lời của stlb bao gồm phần mã hóa video của quy trình.
Peter Cordes

2
@PeterCordes Cách khác , scale=1920:-2:flags=lanczos. Tôi cũng sẽ đề cập đến -2thang đo trong câu trả lời không tồn tại của tôi. Đối với những người không biết bạn có thể đặt -2chiều rộng hoặc chiều cao và nó sẽ tự động cung cấp giá trị chính xác trong khi duy trì tỷ lệ khung hình làm cho giá trị chia hết cho 2 (yêu cầu bởi libx264 cho đầu ra yuv420p).
llogan

Câu trả lời:


17

Cài đặt mặc định cho ffmpeg có chất lượng rất thấp và vì bạn không chỉ định bất kỳ tham số codec hoặc chất lượng nào, nó chỉ sử dụng mặc định (Tôi không biết tại sao các nhà phát triển không khắc phục điều đó vì nó tạo ra rất nhiều câu hỏi trên các diễn đàn mọi nơi).

Chỉnh sửa : mặc định bây giờ khá lành mạnh. Với bản dựng ffmpeg gần đây, bạn không cần chỉ định bất kỳ thứ gì ngoài các tệp đầu vào và đầu ra để đạt được kết quả có thể sử dụng tốt. Tất nhiên, bạn có thể điều chỉnh theo mong muốn của trái tim mình.

Hãy thử thêm -c:v libx264 -crf 20 -preset slowvào lệnh.

  • -c:v libx264 bảo nó sử dụng bộ mã hóa libx264,
  • crf 20 sử dụng bộ định lượng Yếu tố tỷ lệ không đổi (có nghĩa nghịch lý là tốc độ bit thay đổi, nhưng chất lượng không đổi) với giá trị 20 (chất lượng khá tốt; chất lượng thấp hơn / tệp lớn hơn, cao hơn là crappier / nhỏ hơn),
  • các slowcài đặt trước là một phím tắt cho một loạt các thiết lập mã hóa đó có nghĩa nó đặt nỗ lực nhiều hơn một chút vào nó hơn so với mặc định (trung bình).

Bạn có thể điều chỉnh các cài đặt này, xem hướng dẫn mã hóa h.264 để biết hướng dẫn về các nút cần xoay.

Và nếu bạn đang sử dụng âm thanh nguyên trạng, hãy thêm c:a copy. Điều đó sẽ thực hiện một bản sao thẳng của luồng âm thanh mà không cần mã hóa lại.


Mặc định phụ thuộc vào bộ mã hóa. libx264 thường được sử dụng cho đầu ra MP4 theo mặc định và nó tạo ra đầu ra chất lượng tốt mà không có tùy chọn bổ sung, nhưng bản dựng ffmpeg trong câu hỏi dường như không hỗ trợ bộ mã hóa này và do đó sử dụng bộ mã hóa cổ đại mpeg4tạo ra video MPEG-4 Phần 2 và mặc định cho nó là lành mạnh hơn trong thời hoàng kim của nó (chẳng hạn như 320x240, v.v.).
llogan

Thật tốt khi biết rằng libx264 là mặc định.
stib 23/215

Tôi muốn nói CRF 20 là khá darn tốt. 18 là mất chức năng. Tôi làm hầu hết các video của mình lúc 23.
user24601

Hầu hết các công việc của tôi được hiển thị trên các thiết bị phát lại hoạt động cục bộ từ thẻ SD. Tôi không cần tối ưu hóa nhiều cho kích thước, vì vậy tôi để chất lượng cao nhất có thể. Tôi đồng ý, tôi sẽ quay số nếu tôi phân phối qua web.
stib

Điều này đã không giúp tôi. Tôi vẫn có sự kỳ lạ khối ở bất cứ nơi nào chuyển động xảy ra trong video. crf của 18, cài đặt trước để chậm. 2,7k-> 1080p.
tua lại

0

Sử dụng avconv nếu bạn muốn:

avconv -i 4kfile.mp4 -s hd1080 -c:v libx264 -c:a copy fullhdfile.mp4
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.