ffmpeg / avconv buộc đầu ra được chia tỷ lệ chia hết cho 2


10

Tôi ghi lại máy tính để bàn của mình với avconv (còn gọi là ffmpeg) và sau đó mở rộng nó thành 720p.

Gần đây tôi đã thêm vào tập lệnh của mình để họ có thể chọn một cửa sổ với xwininfo và nó sẽ ghi lại một cửa sổ cụ thể.

Tuy nhiên, nếu định dạng đầu ra không chia hết cho 2 bộ mã hóa sẽ bị lỗi và tôi không nhận được video của mình.

Có cách nào khắc phục điều này trong ffmpeg để tôi không phải thực hiện một loạt phép toán thủ công trong bash để đặt các giá trị tỷ lệ không?

Có thể có bộ lọc tỷ lệ trừ / thêm một cho chiều rộng / chiều cao nếu chúng không đồng đều? (tròn?)

Có thể áp dụng một bộ lọc khác sau quy mô ban đầu có thể thực hiện điều này? (Điều này sẽ làm tròn các video có kích thước đầu vào không đồng đều và không có tỷ lệ)

#!/bin/bash
avconv \
-f x11grab -r $fps -s $capturesize -i :0.0$offset \
-vcodec libx264 \
-vf scale=-1:720 \
-pre:v lossless_ultrafast \
-threads 4 \
-y $@

Một số danh sách gửi thư cũ đề xuất một round()chức năng bạn có thể sử dụng trong bộ lọc nhưng tôi dường như không thể hiểu đúng cú pháp. Nếu nó hoạt động, một scale=round(iw,2):round(ih,2)bộ lọc được áp dụng ở cuối sẽ giải quyết tất cả các vấn đề của tôi cùng một lúc. iwihdường như không hoạt động.

Câu trả lời:


9

Vì đôi khi chia cho 2 số lẻ, nên:

-vf scale="trunc(oh*a/2)*2:720"

Điều này thực hiện những gì người ta muốn với -1:720cú pháp (giữ tỷ lệ khung hình gốc)


Tôi sử dụng ceilthay thế truncđể có được số cặp cao hơn như trường hợp 16: 9 480p
Felipe Alcacibar

8

Trên thực tế bộ lọc có thể xử lý nó trực tiếp. Bạn chỉ cần vượt qua -2thay vì -1vào bộ lọc: vd

-vf scale="-2:720"

Tôi đã rất ngạc nhiên khi phát hiện ra điều này trong một báo cáo lỗi từ 3 năm trước .


Không làm việc cho tôi, phiên bản tối thiểu hỗ trợ này là gì?
letmaik

3
-2 hoạt động với tôi trong phiên bản ffmpeg 2.3.3
Lance Nanek

7

Sau rất nhiều thử nghiệm, có vẻ như bộ lọc sau được áp dụng sau các bộ lọc tỷ lệ khác sẽ làm tròn chiều rộng và chiều cao thành 2.

scale=trunc(in_w/2)*2:trunc(in_h/2)*2

Về cơ bản, đó là một phép chia, tròn, nhân, tôi chỉ không có cú pháp đúng.

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.