Thay đổi tốc độ khung hình trong ffmpeg mà không cần mã hóa lại


14

Tôi có một video mkv (h264) là 23.976 khung hình / giây (24000/1001) nhưng tôi muốn chuyển đổi nó thành 25 khung hình / giây mà không cần mã hóa lại và mất chất lượng. Tôi biết mkvmerge có thể làm điều đó (với tùy chọn --default-thời gian '0: 25fps') nhưng tôi muốn làm điều đó trực tiếp từ ffmpeg nếu có thể Theo các tài liệu này sẽ hoạt động:

ffmpeg -i input.mkv -r 25 -vcodec copy output.mkv

nhưng khi tôi thực hiện nó tôi chỉ nhận được cùng một khung hình / giây. Phương pháp đúng để làm điều đó (nếu tồn tại) trong ffmpeg là gì?


1
Tôi tin rằng điều đó là không thể với FFmpeg vào lúc này. -rkhông tương thích với sao chép luồng và không có bộ lọc dòng bit để thay đổi tốc độ khung hình.
Ely

1
quá tệ. Tôi sẽ phải sử dụng mkvmerge mỗi lần. cảm ơn
phate89

1
Có một cách phức tạp để làm điều này với ffmpeg thông thường và một cách trực tiếp để làm điều này với một phiên bản sửa đổi cũ của ffmpeg. Nếu bạn quan tâm, tôi sẽ viết nó như một câu trả lời.
Gyan

1
Vâng cảm ơn..tôi muốn làm điều đó mà không cần công cụ bổ sung (tôi đã cần ffmpeg)
phate89

1
@Mulvya bạn đang nói về điều này phải không? Tôi đã do dự để liên kết nó, nhưng bây giờ nó đã cũ .. Quan tâm đến cách thức phức tạp để làm điều đó với FFmpeg thông thường mặc dù.
Ely

Câu trả lời:


15

Đây là phương pháp sử dụng các phiên bản hiện tại của FFmpeg. Nó dựa vào bộ giải mã concat không thay đổi kích thước PTS của các đầu vào sau tệp đầu tiên, mà chỉ áp dụng một giá trị bù cố định. Giả sử bạn có luồng 30 khung hình / giây với thời gian 15360(điển hình của đầu ra FFmpeg). Điều đó có nghĩa là khung 0có PTS 0và khung 30có PTS 15360. Điều này sẽ trở thành luồng 45 khung hình / giây nếu chúng ta có thể thay đổi thời gian thành 23040mà không ảnh hưởng đến các giá trị PTS.

Về cơ bản, đó là những gì phương pháp dưới đây làm.

1 . Xác định các thuộc tính nguồn.

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s,
       30 fps, 30 tbr, 15360 tbn (default)

Bạn muốn lưu ý các thuộc tính nguồn, đặc biệt là độ phân giải và tbn.


2a . (Tùy chọn) Thay đổi thời gian thành một cái gì đó thuận tiện, để làm cho việc tính toán đơn giản hơn.

ffmpeg -i in.mp4 -c copy -an -video_track_timescale 30 in-v30.mp4

Điều này giúp chúng tôi

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s, \
       30 fps, 30 tbr, 30 tbn (default

Nếu bạn thực hiện bước này, khoảng thời gian mới sẽ bằng hoặc bội số nguyên của tốc độ khung hình ban đầu.

2b . Tính toán thời gian cần thiết, để cho tốc độ khung hình đích x, PTS của khung # xtrong nguồn phải có cùng giá trị như mới tbn. Nếu bạn thực hiện bước 2a, điều này rất dễ dàng và nó chỉ đơn giản là tốc độ khung hình mới. Vì vậy, đối với fps mục tiêu 45, mới tbnnên 45.


3 . Tạo video giả.

ffmpeg -f lavfi -i color=s=1280x720:r=45:d=1 -profile:v main -video_track_timescale 45 0.mp4

Tất cả các thuộc tính phải giống như độ phân giải, cấu hình H.264, định dạng pixel, số refs..vv để có kết quả tốt nhất.


4 Liên kết các video.

Đầu tiên tạo một tệp văn bản

file '0.mp4'
file 'in-v30.mp4'

Sau đó, concat

ffmpeg -f concat -i list.txt -c copy -video_track_timescale 45 45fps.mp4

Tệp đầu ra sẽ có video thứ 2 phát ở tốc độ 45 khung hình / giây.

5 . Bây giờ, tách ra khỏi preroll giả

ffmpeg -ss 1.1 -i 45fps.mp4 -c copy -avoid_negative_ts make_zero in45.mp4

và bạn có

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1757 kb/s, \
       45 fps, 45 tbr, 11520 tbn (default)

Tôi đã nói điều này đã được chia sẻ!


1
rất thông minh, trả lời tốt.
Rowe Morehouse
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.