Ubah kecepatan bingkai video MP4 dengan ffmpeg

8

Saya punya video dalam format mp4 dengan frame rate .33(1 frame selama 3 detik). Saya ingin meningkatkan frame rate menjadi 5 frame / detik. Saya sudah mencoba perintah di bawah ini tetapi tidak melakukan apa-apa:

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

Tahu kenapa ffmpeg mengabaikan -ropsi?

firemonkey
sumber
Jika Anda mencoba mempercepat / memperlambat video, alih-alih menduplikasi / menjatuhkan bingkai, lihat superuser.com/questions/854753/… dan / atau askubuntu.com/questions/370692/…
Peter Cordes

Jawaban:

7

Saya tahu ini adalah pertanyaan lama tetapi tidak ada jawaban saat ini yang direkomendasikan.

Remuxing lossless (video)

Sebagaimana dicatat dalam komentar ada cara untuk melakukan ini di mana video tidak harus dikodekan ulang. Ini membutuhkan remuxing file ke format MKV penampung yang berbeda dan kemudian remuxing kembali ke MP4. Berikut adalah contoh yang mengubah video menjadi 12 frame / detik:

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

Jika video berisi audio, Anda juga dapat memperlambatnya tanpa mengubah nada, tetapi itu bukan konversi tanpa kerugian. Contoh di bawah ini mengasumsikan video sumber adalah 24 frame / detik sehingga audio perlu diperlambat hingga setengah (0,5) kecepatan menggunakan filter atempo 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

Panduan Wiki FFMPEG

Ini adalah panduan dari wiki ffmpeg . Perhatikan bahwa semua opsi ini memang mengharuskan pengodean ulang video.

Mempercepat / memperlambat video

Anda dapat mengubah kecepatan aliran video menggunakan filter video setpts. Perhatikan bahwa dalam contoh berikut, aliran audio tidak berubah, sehingga idealnya harus dinonaktifkan dengan -an.

Untuk menggandakan kecepatan video, Anda dapat menggunakan:

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

Filter berfungsi dengan mengubah cap waktu presentasi (PTS) dari setiap bingkai video. Misalnya, jika ada dua frame berturut-turut yang ditampilkan di stempel waktu 1 dan 2, dan Anda ingin mempercepat video, stempel waktu tersebut harus masing-masing menjadi 0,5 dan 1. Jadi, kita harus mengalikannya dengan 0,5.

Perhatikan bahwa metode ini akan menjatuhkan frame untuk mencapai kecepatan yang diinginkan. Anda dapat menghindari frame yang terjatuh dengan menentukan frame rate output yang lebih tinggi dari input. Misalnya, untuk beralih dari input 4 FPS ke input yang dipercepat hingga 4x itu (16 FPS):

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

Untuk memperlambat video Anda, Anda harus menggunakan pengganda yang lebih besar dari 1:

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

Halus

Anda dapat memuluskan video lambat / cepat dengan filter video minterpolate. Ini juga dikenal sebagai "interpolasi gerak" atau "aliran optik".

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

Pilihan lain termasuk slowmoVideo dan Butterflow. Mempercepat / memperlambat audio

Anda dapat mempercepat atau memperlambat audio dengan filter audio atempo. Untuk menggandakan kecepatan audio:

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

Filter atempo terbatas untuk menggunakan nilai antara 0,5 dan 2,0 (sehingga dapat memperlambatnya hingga tidak kurang dari setengah kecepatan asli, dan mempercepat hingga tidak lebih dari dua kali lipat input). Jika perlu, Anda dapat mengatasi batasan ini dengan merangkai beberapa filter atempo bersama-sama. Berikut ini dengan empat kali lipat kecepatan audio:

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

Dengan menggunakan filtergraph yang kompleks, Anda dapat mempercepat video dan audio secara bersamaan:

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
pseudosavant
sumber
1
Dimungkinkan untuk mempercepat / memperlambat hanya dengan remuxing, tetapi FFmpeg tidak tahu bagaimana melakukannya . misal untuk mkv, mkvtoolnix dapat melakukannya. mis. mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv Ubah framerate pada wadah MKV . Anda dapat melakukan remux ke MKV dan kembali ke MP4, atau menemukan alat yang melakukannya untuk MP4 secara langsung. xcoding video sangat intensif-CPU dan lossy, jadi ini pilihan yang mengerikan.
Peter Cordes
Sepenuhnya setuju bahwa remuxing ke framerate yang lebih rendah lebih disukai karena merupakan pendekatan lossless yang jauh lebih sedikit sumber daya intensif. Namun dalam praktiknya saya belum menemukan alat yang bagus untuk melakukan itu dengan MP4. Saya belum mencoba benar-benar baru-baru ini, tetapi ketika saya pertama kali menulis jawaban ini saya telah melakukan remuxing MP4-> MKV-> MP4 dan saya tidak bisa membuatnya bekerja menggunakan mkvtoolnix, ffmpeg, dan / atau mp4box. Saya harus mencoba dengan parameter yang Anda sarankan.
pseudosavant
6

Jika file input tidak memiliki frame rate yang valid, Anda mungkin harus mengaturnya secara eksplisit

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Martin Beckett
sumber
Ini transkode ketika Anda benar-benar hanya perlu melakukan remux. (Kecuali jika Anda benar-benar ingin menggandakan / menjatuhkan bingkai alih-alih memperlambat / mempercepat video.)
Peter Cordes
3

Saya hanya bisa membuat framerate yang diubah berlaku jika file input digolongkan sebagai file "mentah":

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

Tanpa menentukan -f h264itu akan default ke 25 fps dan itu tidak dapat diubah. Rupanya ini karena stream tidak memiliki informasi framerate sama sekali dan ini adalah framerate default ffmpeg.

Tampaknya ketika Anda menggunakan -rsebagai opsi output, duplikat atau menjatuhkan frame sehingga video diputar pada kecepatan yang sama - dalam hal ini, bukan apa yang Anda inginkan! Tetapi mengubah framerate input seperti di atas akan menyebabkan video mempercepat atau memperlambat, tanpa bingkai hilang atau terduplikasi.

Malvine
sumber
1
Jawaban bermanfaat saya. Tidak ada pengkodean ulang di sini
yota
1

Fitur seperti itu - untuk mengubah framerate - disebut "conforming" dan sering digunakan untuk menghasilkan gerak lambat atau maju cepat seperti menunjukkan pertumbuhan tanaman dalam hitungan menit, dalam hitungan hari. ffmpeg tidak mengijinkan menimpa / mengubah framerate tanpa re-encoding . Jika itu terjadi, durasi akan berubah dan audio akan tidak sinkron kecuali jika diperbaiki secara terpisah. Tapi saya khawatir audio tidak menarik dalam kasus Anda dengan framerate 0,33

Anda ingin menyesuaikan karena Anda hanya ingin mengubah framerate, tetapi ffmpeg mengabaikan secara -rdiam-diamjika framerate ditentukan dalam file input. Karena file input Anda dalam format .mp4, framerate-nya sendiri diutamakan-rketika re-encode tidak diperlukan. Untuk ini, Anda memerlukan alat yang berbeda: mencoder.

Dengan asumsi file input Anda tidak mengandung suara - sepertinya benar untuk semua video dengan framerate .33 - yang Anda butuhkan adalah:

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

Perhatikan bahwa mencoder secara default menghasilkan output dalam format AVI.

Tankman 六四
sumber
1
Ini salah. Jika rditentukan sebagai saklar keluaran, ffmpeg akan menghasilkan keluaran pada framerate yang ditentukan, terlepas dari framerate input. Jika rditetapkan sebagai saklar input, ffmpeg akan menduplikasi atau menjatuhkan frame seperlunya untuk memberi makan jumlah frame yang ditentukan per detik dari input ke filter / encoder.
Gyan
Perilaku yang Anda jelaskan ketika rsaklar input bertentangan dengan percobaan saya sebelumnya pada format .mp4, catatan Malvineous (di halaman ini) dan deskripsi bug 403 trac.ffmpeg.org/ticket/403 ; deskripsi Anda ketika rdigunakan pada output terjadi ketika pengkodean ulang, sedangkan skenario OP tampaknya kasus yang sesuai (memperbaiki framerate tanpa pengkodean ulang) oleh fakta bahwa ia memiliki 0,33 framerate.
Tankman 六四
1
Periksa laporan yang ditempel di sini . Perhatikan baris perintah di bagian atas, input dan output metadata dan akhirnya tidak. frame dikodekan.
Gyan
1
Setuju bahwa OP hanya ingin menyesuaikan file tetapi perintah yang diberikan adalah penyandian ulang karena saklar salin tidak ditentukan. Dalam skenario itu, ffmpeg harus menghasilkan aliran baru di rfps.
Gyan
Terima kasih Mulvya untuk hasil sampel yang meyakinkan. Ya, Anda benar tentang penggunaan -r. Penggunaan itu tidak dapat memengaruhi percobaan saya sebelumnya dalam menanggapi OP karena, karena berpikir tentang kasus yang sesuai, saya tidak pernah menjatuhkan parameter salin dari ffmpeg, dan -rkarenanya diabaikan. Saya menulis permintaan fitur: trac.ffmpeg.org/ticket/5170
Tankman 六四
0

Cara tercepat adalah membuat file BAT di direktori dengan baris berikut:

@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

)

Anda harus memiliki mkvmerge dan ffmpeg di direktori yang sama. Ini mengubah setiap file mp4 dalam detik secara otomatis tanpa kehilangan kualitas.

Peder Gerdin
sumber