Cách tiếp cận cơ bản là thêm viền đen vào video của bạn để làm cho nó phù hợp với một trong các tỷ lệ khung hình được phép của DVD.
TLDR: bỏ qua để Kết luận.
Một vài định nghĩa
Tuy nhiên, trước tiên, tôi cần xác định một vài điều khác nhau:
- Một tỷ lệ khung hình chỉ đơn giản là chiều rộng của một cái gì đó chia cho chiều cao, thường được biểu thị dưới dạng phân số. Thông thường dấu gạch chéo truyền thống được thay thế bằng dấu hai chấm: chúng ta viết 4: 3 thay vì 4 ⁄ 3 . Đôi khi, những điều này được thể hiện bằng số thập phân (1.333,). Bạn cũng có thể gọi nó là 8: 6, 12: 9, 16:12, v.v., vì tất cả đều bằng nhau. Hoặc thậm chí 1.333: 1 (bằng nhau, nếu chỉ bạn có thể viết đủ 3 giây).
- Một màn hình tỉ lệ (DAR) là tỷ lệ khía cạnh của một màn hình thực tế (ví dụ, một TV). Các màn hình phổ biến thường là 4: 3 hoặc 16: 9.
- Một lưu trữ aspect ratio (SAR) là tỷ số giữa chiều rộng với chiều cao (tính bằng pixel) của hình ảnh được lưu trữ hoặc video. Ví dụ: Video DVD NTSC đạt tối đa 720 x 480 ("Full D1"), có SAR là 1,5: 1.
- Một điểm ảnh aspect ratio là tỷ lệ khía cạnh của một điểm ảnh duy nhất trong một hình ảnh được lưu trữ. Trong video, pixel không phải lúc nào cũng vuông. Khi không vuông, chúng thường hẹp hơn so với chiều cao.
Có một mối quan hệ toán học đơn giản giữa ba điều trên: SAR × PAR = DAR. Ví dụ: 720: 480 * 8: 9 = 4: 3. Đó là video cho màn hình 4: 3 đặt trên DVD ở độ phân giải đầy đủ.
Một sự phức tạp khác
Truyền hình analog không có pixel. Thay vào đó, nó có một tín hiệu thay đổi liên tục. Một phần nhất định của tín hiệu đó được cho là được chiếu lên từng dòng của màn hình, sau đó có thời gian không hoạt động để cho phép, ví dụ, di chuyển đến dòng tiếp theo. Mặc dù vậy, các TV khác nhau sẽ hiển thị số lượng hơi khác nhau của từng dòng và điều đó có thể thay đổi theo thời gian sử dụng của TV hoặc ngay cả khi TV nóng lên.
DVD nói không sử dụng 8 pixel ngoài cùng bên phải và bên phải. Vì vậy, trong số 720, 704 được cho là sẽ được sử dụng. 8 pixel ở mỗi bên được cho là có màu đen. PAR được chỉ định là 10:11 này.
Tất nhiên, mọi người đã từng sử dụng thiết bị kỹ thuật số thấy điều này thật ngớ ngẩn (để sử dụng những từ phù hợp với công ty lịch sự). Và nhiều bản phát hành DVD thương mại thực sự sử dụng tất cả 720 pixel, một số mong đợi PAR 10:11 và một số mong đợi 8: 9. [Hoặc tương tự cho DAR 16: 9]. Hầu hết các đầu DVD phần cứng sử dụng 10:11, mặc dù tất nhiên nó cũng sẽ phụ thuộc vào cài đặt TV.
Tóm lược
Nếu bạn đang bắt đầu với video nơi bạn muốn mọi pixel được hiển thị, có lẽ bạn muốn điều chỉnh nó thành 704x480 (SAR 22:15), với các thanh màu đen 8px. Nếu các mặt bị cắt là OK, thì bạn có thể sử dụng 720x480 đầy đủ. Dù bằng cách nào, bạn cần phải chia tỷ lệ video của mình theo yêu cầu để có PAR ở mức 10:11 (DAR 4: 3) hoặc 40:33 (DAR của 16: 9) và, nếu thấp hơn khung 720x480 đầy đủ, hãy thêm màu đen thanh.
Thực tế làm điều đó
Rất may, ffmpeg
có thể làm điều này. Trên diễn đàn hỗ trợ ffmpeg không chính thức, ks_kalvan cung cấp chuỗi bộ lọc video ffmpeg để nhắm mục tiêu DAR 16: 9:
-filter:v "scale='w=min(720,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((720*40/33/dar)/2+0.5)*2)',pad='w=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='r=40/33'"
Nó hoạt động thế nào‽
Lưu ý có ba bộ lọc trong đó: scale
, pad
, và setsar
. Chúng ta sẽ lần lượt thực hiện lần lượt, từ cuối, vì cuối cùng là đơn giản nhất.
Bộ lọc cuối cùng gây nhầm lẫn cho đến khi bạn kiểm tra tài liệu (`man ffmpeg-filter) và tìm dòng đã xóa này: bộ lọc" setsar "đặt Tỷ lệ khung hình mẫu (còn gọi là Pixel) cho video đầu ra của bộ lọc." Vì vậy, đó thực sự là thiết lập cải cách hành chính thành 40:33, đó là giá trị mà chúng tôi đã nói chúng tôi muốn sử dụng ở trên.
Bộ pad
lọc thêm viền đen. Tài liệu cho chúng ta biết rằng ow là chiều rộng đầu ra (nghĩa là 720, từ w=720
phần), oh chiều cao đầu ra (nghĩa là 480, từ h=480
phần). iw và ih lần lượt là chiều rộng và chiều cao đầu vào. ow - iw là số pixel chúng ta thêm vào chiều rộng (và tương tự oh - ih cho chiều cao); chia cho 2 đặt một nửa số đó vào mỗi bên của bức tranh. Nói cách khác, chúng ta đang tập trung vào bức tranh.
Bộ scale
lọc thay đổi kích thước video. Các w=
tùy chọn xác định chiều rộng và / đầu ra mới h=
tùy chọn định chiều cao. Một lần nữa, đó là một biểu thức, nhưng phức tạp hơn. Các công thức chiều rộng và chiều cao là như nhau, chỉ với chiều cao và chiều rộng được hoán đổi. Hãy xem xét w=
công thức width ( ):
Các chức năng và toán tử được ghi lại trong man ffmpeg-util
. Đối với các số dương, trunc(x+0.5)
là mẹo để lấy số nguyên gần nhất, một số thứ mà ffmpeg không có.
Dựa trên trunc(x+0.5)
mánh khóe đó , chúng ta có trunc(x/2+0.5)*2
. x / 2 cho chúng ta một nửa x, tất nhiên; cắt ngắn sau đó làm tròn nó đến số nguyên gần nhất. Nhân đôi nó sau đó cho chúng ta số chẵn gần nhất .
Tôi sẽ sử dụng «W» trong đó lệnh thực tế như sử dụng 720. Đó là chiều rộng đầu ra cuối cùng tính bằng pixel. Tương tự, «H» thay vì 480 (chiều cao đầu ra cuối cùng). Thay vì 40/33, «PAR», vì đó là tỷ lệ khung hình pixel mục tiêu. Và PAR⁻¹ là đối ứng của cải cách hành chính, tức là 33/40.
dar
là một biến ffmpeg. Đây là DAR của video đầu vào.
Một điều quan trọng để hiểu điều này là phép tính ở giữa, nơi chúng ta có một phép tính đó là «H» × dar ÷ «PAR». Hãy nhớ rằng dar là màn hình hiển thị w / h của video gốc. Vì vậy, nhân chiều rộng mục tiêu (tính bằng pixel) cho dar sẽ cho chúng ta độ rộng của nó nếu chúng ta thu nhỏ video để có chiều cao mục tiêu «H» và pixel vuông. Chia theo PAR sau đó chuyển đổi thành chiều rộng trong các pixel không vuông mà chúng ta thực sự đang sử dụng.
min(«W», # take the minimum [lesser of] target width and...
trunc( # the truncation of (round to integer towards 0)
(«H»*«PAR⁻¹»*dar) # calculate the wanted output width, see note above
/ 2 + 0.5) * 2 # and get the nearest even number to that
))
Ví dụ: Giả sử bạn quay video 1280 x 720 pixel với tỷ lệ khung hình hiển thị 16: 9. Bắt đầu từ giữa:
- «H» * «PAR» * dar = 480 * 33/40 * 16/9 = 704.
- 704/2 = 352.
- cắt ngắn (352 + 0,5) = 352
- 352 * 2 = 704
- tối thiểu (720, 704) = 704
Đó là chiều rộng có thể sử dụng đầy đủ (nghĩa là, ngoại trừ các vùng không thể sử dụng 8px), như chúng ta mong đợi về video 16: 9 trên màn hình 16: 9.
Và khi chúng tôi làm điều đó theo chiều cao, chúng tôi nhận được 490, nhờ số min () được giữ ở mức 480. Nhưng thực tế, điều đó cho thấy rằng chúng tôi có thể muốn sử dụng 704 ở đó (chiều rộng có thể sử dụng) thay vì 720, chính xác 480. Vì vậy, có vẻ như có một lỗi nhỏ ở đó, gây ra một biến dạng nhỏ (và có thể không thể nhận ra). Điều đó được cố định dưới đây, tôi tin.
Tóm lại là
ffmpeg -i YOUR-FILE-HERE \
-filter:v "scale='w=min(720,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((704*40/33/dar)/2+0.5)*2)',pad='w=720:h=480:x=(ow-iw)/2:y=(oh-ih)/2',setsar='r=40/33'" \
-target ntsc-dvd YOUR-OUTPUT-HERE.mpg
LƯU Ý: Không có ffmpeg cũ hơn -filter:v
. -vf
Thay vào đó, bạn có thể thử (chưa được kiểm tra) hoặc tốt hơn là tải xuống bản dựng tĩnh mới từ ffmpeg.org .