Ghi tập tin video với tỷ lệ khung hình không chuẩn vào DVD


7

Cách tiếp cận dòng lệnh Unixy tiêu chuẩn để ghi tệp video vào DVD như sau (giả sử)

# 1. First use ffmpeg to convert to an mpg file.

ffmpeg -i input.m4v -target ntsc-dvd output.mpg

# 2. now do the authoring

dvdauthor --title -o dvd -f output.mpg
dvdauthor -o dvd -T

LƯU Ý: --titleđặt tiêu đề của DVD, -Tđặt mục lục. Trong cả hai lệnh trên, công tắc -o đang tham chiếu một thư mục, KHÔNG phải là dvd thực tế.

# 3. roll the .mpg file into an ISO file
genisoimage -dvd-video -o dvdimage.iso dvd

Cuối cùng, ghi tập tin iso kết quả vào một đĩa DVD. Tôi sử dụng Brasero, đáng tin cậy.

Tuy nhiên, phương pháp này không hoạt động tốt với tỷ lệ khung hình không chuẩn. Định dạng DVD khá cứng nhắc về việc chỉ định tỷ lệ khung hình nào được chấp nhận. Bạn sẽ biết nếu bạn gặp vấn đề này nếu dvdauthor nói điều gì đó tương tự như

WARN: unknown mpeg2 aspect ratio 1

Một cách tốt để sửa đổi phương pháp này để xử lý tỷ lệ khung hình không chuẩn là gì?

CẬP NHẬT: Cảm ơn Anthony cho câu trả lời rất kỹ lưỡng và rõ ràng. Tôi hy vọng điều này sẽ hữu ích cho những người đang cố gắng tìm câu trả lời cho vấn đề gây phiền nhiễu này. Tôi không biết bất kỳ lời giải thích rõ ràng nào khác về điều này trên mạng.

Câu trả lời:


6

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ì 43 . Đô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, ffmpegcó 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ộ padlọ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=720phần), oh chiều cao đầu ra (nghĩa là 480, từ h=480phần). iwih 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ộ scalelọ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.

  • darlà 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:

  1. «H» * «PAR» * dar = 480 * 33/40 * 16/9 = 704.
  2. 704/2 = 352.
  3. cắt ngắn (352 + 0,5) = 352
  4. 352 * 2 = 704
  5. 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. -vfThay 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 .

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.