Thay đổi tốc độ khung hình của video MP4 bằng ffmpeg


8

Tôi có một video ở định dạng mp4 với tốc độ khung hình .33(1 khung hình trong 3 giây). Tôi muốn tăng tốc độ khung hình lên 5 khung hình / giây. Tôi đã thử lệnh dưới đây nhưng nó không làm gì cả:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Bất cứ ý tưởng tại sao ffmpeg đang bỏ qua -rtùy chọn?


Nếu bạn đang cố gắng tăng tốc / làm chậm video, thay vì sao chép / thả khung hình, hãy xem superuser.com/questions/854753/ và và hoặc hoặc Askubfox.com/questions/370692/iêu
Peter Cordes

Câu trả lời:


7

Tôi biết đây là một câu hỏi cũ nhưng không có câu trả lời hiện tại nào là cách được đề xuất nữa.

Không mất dữ liệu (video)

Như đã lưu ý trong các bình luận, có một cách để làm điều này mà video không phải được mã hóa lại. Nó yêu cầu làm lại tập tin theo định dạng MKV khác và sau đó chuyển lại tập tin thành MP4. Dưới đây là một ví dụ thay đổi video thành 12 khung hình / giây:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Nếu video chứa âm thanh, bạn cũng có thể làm chậm nó mà không thay đổi cao độ, nhưng đó không phải là một chuyển đổi không mất mát. Ví dụ dưới đây giả sử video nguồn là 24 khung hình / giây để âm thanh cần được giảm tốc độ xuống một nửa (0,5) bằng bộ lọc atempo của ffmpeg .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

Hướng dẫn Wiki FFMPEG

Đây là hướng dẫn từ wiki ffmpeg . Lưu ý rằng tất cả các tùy chọn này đều yêu cầu mã hóa lại video.

Tăng tốc / làm chậm video

Bạn có thể thay đổi tốc độ của luồng video bằng bộ lọc video setpts. Lưu ý rằng trong các ví dụ sau, luồng âm thanh không bị thay đổi, vì vậy lý tưởng nhất là nên tắt với -an.

Để tăng gấp đôi tốc độ của video, bạn có thể sử dụng:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Bộ lọc hoạt động bằng cách thay đổi dấu thời gian trình bày (PTS) của từng khung hình video. Ví dụ: nếu có hai khung thành công được hiển thị ở dấu thời gian 1 và 2 và bạn muốn tăng tốc video, thì các dấu thời gian đó cần phải trở thành 0,5 và 1, tương ứng. Do đó, chúng ta phải nhân chúng với 0,5.

Lưu ý rằng phương pháp này sẽ thả khung hình để đạt được tốc độ mong muốn. Bạn có thể tránh các khung hình bị rớt bằng cách chỉ định tốc độ khung hình đầu ra cao hơn đầu vào. Ví dụ: để chuyển từ đầu vào 4 FPS sang tốc độ tăng gấp 4 lần (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Để làm chậm video của bạn, bạn phải sử dụng hệ số nhân lớn hơn 1:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Trơn tru

Bạn có thể làm mịn video chậm / nhanh với bộ lọc video minterpolate. Điều này còn được gọi là "nội suy chuyển động" hoặc "dòng quang".

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Các tùy chọn khác bao gồm SlowmoVideo và Butterflow. Tăng tốc / làm chậm âm thanh

Bạn có thể tăng tốc hoặc làm chậm âm thanh với bộ lọc âm thanh atempo. Để tăng gấp đôi tốc độ của âm thanh:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

Bộ lọc atempo bị giới hạn trong việc sử dụng các giá trị trong khoảng 0,5 đến 2,0 (vì vậy nó có thể làm chậm nó xuống không dưới một nửa tốc độ ban đầu và tăng tốc độ không quá gấp đôi đầu vào). Nếu bạn cần, bạn có thể khắc phục giới hạn này bằng cách xâu chuỗi nhiều bộ lọc atempo lại với nhau. Sau đây với tốc độ âm thanh tăng gấp bốn lần:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Sử dụng một bộ lọc phức tạp, bạn có thể tăng tốc video và âm thanh cùng một lúc:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

1
Có thể tăng tốc / chậm chỉ bằng cách làm lại, nhưng FFmpeg không biết cách thực hiện . ví dụ cho mkv, mkvtoolnix có thể làm điều đó. ví dụ: mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv Thay đổi tốc độ khung hình trên container MKV . Bạn có thể chuyển sang MKV và quay lại MP4 hoặc tìm một công cụ thực hiện trực tiếp cho MP4. xcoding video rất tốn CPU và mất dữ liệu, vì vậy đây là một lựa chọn kinh khủng.
Peter Cordes

Hoàn toàn đồng ý rằng việc chuyển sang một tốc độ khung hình thấp hơn được ưu tiên vì đây là một cách tiếp cận không mất dữ liệu mà ít tốn nhiều tài nguyên hơn. Trong thực tế, tôi chưa tìm thấy công cụ tốt để làm điều đó với MP4. Gần đây tôi đã không thử, nhưng trở lại khi lần đầu tiên tôi viết câu trả lời này, tôi đã thực hiện chuyển đổi MP4-> MKV-> MP4 và tôi không thể làm cho nó hoạt động bằng mkvtoolnix, ffmpeg và / hoặc mp4box. Tôi sẽ phải thử với các thông số bạn đề xuất.
pseudosavant

6

Nếu tệp đầu vào không có tốc độ khung hình hợp lệ, bạn có thể phải đặt nó rõ ràng

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

Điều này chuyển mã khi bạn thực sự chỉ cần làm lại. (Trừ khi bạn thực sự muốn sao chép / thả khung hình thay vì làm chậm / tăng tốc video.)
Peter Cordes

3

Tôi chỉ có thể nhận được tốc độ khung hình đã thay đổi để có hiệu lực nếu tệp đầu vào được phân loại là tệp "thô":

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Nếu không chỉ định -f h264nó sẽ mặc định là 25 khung hình / giây và nó không thể thay đổi. Rõ ràng điều này là do luồng không có bất kỳ thông tin tốc độ khung hình nào và đây là tốc độ khung hình mặc định của ffmpeg.

Rõ ràng khi bạn sử dụng -rlàm tùy chọn đầu ra, nó sẽ nhân đôi hoặc giảm khung hình để video phát với cùng tốc độ - trong trường hợp này, không phải là điều bạn muốn! Nhưng việc thay đổi tốc độ khung hình đầu vào như trên sẽ khiến video tăng tốc hoặc chậm lại, không có khung hình bị mất hoặc bị trùng lặp.


1
Câu trả lời hữu ích của tôi. Không mã hóa lại ở đây
yota

1

Một tính năng như vậy - của việc thay đổi tốc độ khung hình - được gọi là "tuân thủ" và thường được sử dụng để tạo ra chuyển động chậm hoặc chuyển tiếp nhanh như thể hiện sự tăng trưởng của cây trong vài phút sau vài ngày. ffmpeg không cho phép ghi đè / thay đổi tốc độ khung hình mà không cần mã hóa lại . Nếu làm như vậy, thời lượng sẽ thay đổi và âm thanh sẽ không đồng bộ trừ khi được sửa đổi riêng. Nhưng tôi e rằng âm thanh không được quan tâm trong trường hợp của bạn với tốc độ khung hình .33

Bạn muốn tuân thủ vì bạn chỉ muốn thay đổi tốc độ khung hình, nhưng ffmpeg bỏ qua -râm thầmnếu tốc độ khung hình được chỉ định trong tệp đầu vào. Vì tệp đầu vào của bạn có định dạng .mp4, nên tốc độ khung hình của nó được ưu tiên-rkhi mã hóa lại không cần thiết. Đối với điều này, bạn cần một công cụ khác: mencoder.

Giả sử tệp đầu vào của bạn không chứa âm thanh - có thể đúng với bất kỳ video nào có .33 tốc độ khung hình - điều bạn cần là:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Lưu ý rằng mencoder theo mặc định tạo đầu ra ở định dạng AVI.


1
Cái này sai. Nếu rđược chỉ định làm công tắc đầu ra, ffmpeg sẽ tạo đầu ra ở tốc độ khung hình được chỉ định đó, bất kể tốc độ khung hình của đầu vào. Nếu rđược chỉ định làm công tắc đầu vào, ffmpeg sẽ nhân đôi hoặc thả các khung nếu cần để cung cấp số lượng khung hình được chỉ định mỗi giây cho bộ lọc / bộ mã hóa.
Gyan

Hành vi bạn mô tả khi rchuyển đổi đầu vào mâu thuẫn với thử nghiệm trước đó của tôi về định dạng .mp4, ghi chú của Malvineous (trên trang này) và mô tả lỗi 403 trac.ffmpeg.org/ticket/403 ; mô tả của bạn khi rđược sử dụng trên đầu ra xảy ra khi mã hóa lại, trong khi kịch bản của OP dường như là một trường hợp tuân thủ (sửa lỗi tốc độ khung hình mà không mã hóa lại) bởi thực tế là anh ta đã có .33 tốc độ khung hình.
Tankman

1
Kiểm tra báo cáo dán ở đây . Lưu ý dòng lệnh ở trên cùng, siêu dữ liệu đầu vào và đầu ra và cuối cùng là không. của khung được mã hóa.
Gyan

1
Đồng ý rằng OP muốn chỉ tuân thủ tệp nhưng lệnh đã cho của họ được mã hóa lại do (các) công tắc sao chép không được chỉ định. Trong kịch bản đó, ffmpeg sẽ tạo luồng mới tại rfps.
Gyan

Cảm ơn Mulvya cho đầu ra mẫu thuyết phục. Vâng, bạn đúng về cách sử dụng -r. Việc sử dụng đó không thể ảnh hưởng đến các thử nghiệm trước đây của tôi khi phản ứng với OP vì nghĩ rằng trường hợp tuân thủ, tôi không bao giờ bỏ tham số sao chép từ ffmpeg và -rdo đó bị bỏ qua. Tôi đã viết một yêu cầu tính năng: trac.ffmpeg.org/ticket/5170
Tankman六四

0

Cách nhanh nhất là tạo tệp BAT trong thư mục với các hàng sau:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Bạn cần phải có mkvmerge và ffmpeg trong cùng một thư mục. Nó tự động thay đổi mọi tập tin mp4 trong vài giây mà không làm giảm chất lượ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.