Tỷ lệ khung hình chính xác mà không cần mã hóa lại tập tin video


18

Tôi có một luồng video với các thuộc tính sau:

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

Khi tôi chạy nó trong VLC, tôi phải nhấn "A" để thay đổi tỷ lệ khung hình thành "4: 3" để hiển thị video với tỷ lệ khung hình chính xác.

Nhìn vào thực tế video, Có phải lỗi a) video thực tế đã bị kéo dài không chính xác trong dữ liệu pixel hoặc b) có một số giá trị siêu dữ liệu được đặt không chính xác không?

Nếu trước đây, tôi biết tôi có thể mã hóa lại video và thay đổi chiều rộng và chiều cao. Nhưng nếu sau này, lệnh ffmpeg nào tôi chạy để sửa siêu dữ liệu mà không mã hóa lại video?

Câu trả lời:


36

Có một sự khác biệt giữa Tỷ lệ khung hình mẫu (SAR) và Tỷ lệ khung hình hiển thị (DAR). Nếu bạn muốn thay đổi video để hiển thị ở tỷ lệ 4: 3, bạn sẽ cần thay đổi pixel thực tế trong ảnh (bằng cách chia tỷ lệ pixel và thay đổi SAR) hoặc bằng cách đặt cờ siêu dữ liệu ở cấp độ chứa bên ngoài người chơi phương tiện truyền thông để kéo dài hình ảnh đến DAR mong muốn của bạn.

Bạn sẽ không thể chia tỷ lệ pixel và thay đổi SAR mà không áp dụng bộ lọc video. Nếu bạn chọn phương pháp này, bạn sẽ được yêu cầu chuyển mã tệp - vì bạn không thể "sao chép" luồng video trong khi áp dụng bộ lọc video.

Để chia tỷ lệ hình ảnh và thay đổi SAR (trong khi chuyển mã), hãy thử:

ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>

Mặt khác, nếu bạn chỉ muốn thay đổi cờ siêu dữ liệu và điều chỉnh DAR, bạn sẽ có thể truyền phát bản sao video. Để làm điều này, hãy thử:

ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]

Thông minh! Thay đổi khía cạnh làm việc ngay lập tức!
forthrin

1
Bạn không thể sử dụng -c copyvà chia tỷ lệ cùng một lúc; tuy nhiên, bạn có thể sử dụng -aspectđể thay đổi tỷ lệ khung hình ở cấp độ bộ chứa (nhưng không phải ở cấp độ luồng).
llogan

@LordNeckbeard, sử dụng -aspectkhông hoạt động để phát lại ffplay, nhưng không phải trong WMP hoặc MPC-HC. Nó thêm một mục SAR / DAR bổ sung vào Stream #…dòng thông tin FFmpeg/probe/playnhưng dường như không phải là giải pháp để phát lại chung. Kéo dài video với cửa sổ có vẻ như là giải pháp đơn giản nhất để phát lại MPC-HC.
Lumi

đã không làm việc cho tôi cho MPEG2 mà không cần mã hóa lại
Mikhail V

Tôi không biết tại sao nó không làm việc cho tôi. Nó chỉ xuất ra cùng một video!
Tina J

4

Câu trả lời của Delgado là chính xác rằng MP4Box có thể làm điều này, nhưng -partùy chọn không hoạt động hoàn toàn như mô tả. Với một -outtham số (để không làm phiền tệp gốc của bạn):

mp4box source.mp4 -out target.mp4 -par stream-number=width:height

Khi bạn sử dụng -par stream-number=width:height, bạn xác định tỷ lệ khung hình pixel - nghĩa là kết quả của việc chia tỷ lệ khung hình của thiết bị cho tỷ lệ khung hình lưu trữ. (Tương đương, bạn đang mô tả tỷ lệ khung hình của pixel nguồn.) Ví dụ: giả sử bạn có nguồn DVD là 720 × 480 và tỷ lệ khung hình hiển thị chính xác là 4: 3. Đối với trường hợp này, bạn cần:

mp4box source.mp4 -out target.mp4 -par 1=8:9

vì (4/3) / (720/480) = 8/9.

Nếu nguồn đại diện cho các pixel SD NTSC thực (trong trường hợp đó chỉ có 704 × 480 pixel trung tâm được cho là ánh xạ tới màn hình 4 × 3, với độ phân giải 8 pixel ở hai bên), lệnh chính xác sẽ là:

mp4box source.mp4 -out target.mp4 -par 1=10:11

bởi vì (4/3) / (704/480) = 10/11 - chính xác tỷ lệ khung hình pixel tham chiếu cho video NTSC độ nét tiêu chuẩn.

Đối với trường hợp được đưa ra trong câu hỏi, nếu thực sự là 4: 3, thì tỷ lệ khung hình pixel rất kỳ lạ: (4/3) / (720/416) = 104/135. Nó rộng 720, gợi ý nguồn DVD; đó là video 25 khung hình / giây, đề xuất PAL, nhưng PAR hoạt động dưới 1, gợi ý NTSC. Nó có thể là 4: 5, tôi cho rằng (rất gần với 104: 135), nhưng tôi không biết bất cứ điều gì tạo ra tỷ lệ khung hình pixel đó; có thể thử trước, sau đó thử 3: 4 nếu nó vẫn trông hơi quá kéo dài theo chiều ngang. Nếu bạn chắc chắn đó chính xác là 4: 3, tất nhiên, chỉ cần sử dụng 104: 135.


3

ffmpeg không thể thay đổi các tham số của luồng video mà không cần mã hóa lại, MP4Box (một phần của gpac ) và mkvmerge có thể. Trong trường hợp có một luồng video và tỷ lệ khung hình thực / chính xác là 4: 3, bạn có thể muốn thử:

MP4Box -par 1=3:4 VideoFile.mp4

    "-par" : PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
    "1"=   : stream number
    "3:4"  : aspect ratio (lower number 1st!)
    Changes are directly applied to "VideoFile.mp4", no copy

Để xác minh trước và sau: ffmpeg -i VideoFile.mp4


0

Thay đổi SAR mà không cần mã hóa lại cũng hoạt động với ffmpegviệc .mp4sử dụng h264_metadatanhư Gyan đã chỉ ra ở đây :

ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4

Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
MMM
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.