Bagaimana cara memotong frame yang tepat menggunakan ffmpeg?

22

Saya mencoba menggunakan ffmpeg untuk memotong file video pada waktu yang tepat. Bantuan ffmpeg menunjukkan opsi -timecode_frame_start untuk menentukan frame awal tetapi saya tidak dapat menjalankan perintah ini. Video yang dihasilkan selalu dimulai di awal video asli. Berikut ini contoh perintah yang saya jalankan:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

Saya telah memindahkan opsi timecode_frame_start sebelum dan sesudah opsi lain tanpa perubahan hasil. Apakah ada opsi tambahan yang perlu saya tentukan? Saya sudah mencoba berbagai format file, mkv, avi, mp4, dan sepertinya masalahnya tidak terkait codec. Ini satu file yang sudah saya coba:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

Apakah saya melewatkan sesuatu?

curmil
sumber
Tampaknya ini dijawab di milis (dan NB bahwa dengan copy-pvcodec Anda tidak dapat "benar-benar" mendapatkan pemotongan bingkai spesifik, karena hanya dapat melakukan sinkronisasi ulang pada i-frames
rogerdpack
@ user39364 Saya bertanya di milis dan ternyata opsi ini tidak melakukan apa yang diinginkan OP. Saya juga belajar sesuatu yang baru :)
slhck
Hanya ingin mencatat bahwa saya menemukan metode untuk memotong pada frame yang tepat menggunakan melt, lihat Secara akurat memotong file video dari baris perintah - Super User
sdaau

Jawaban:

46

Saya baru tahu bahwa timecode_frame_starttidak berfungsi seperti ini. Satu-satunya cara untuk memulai pada frame tertentu adalah dengan mengubah sejumlah frame menjadi ss.mssintaks, atau hh:mm:ss.ms. Jadi, jika video Anda pada 25 fps, dan Anda ingin memulai pada 133 frame, Anda perlu

133/25 = 5.32

Jadi, lari

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

Perhatikan bahwa memotong frame yang tepat dengan salinan bitstream ( -c:v copy) tidak dimungkinkan karena tidak semua frame dikodekan dalam dan dapat berdiri sendiri.

-ss akan selalu akurat frame.

Jika Anda ingin menyandikan sejumlah frame tertentu, gunakan -frames:v, misalnya:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

Anda juga memiliki pilihan untuk menggunakan filter video , tetapi dukungan audio mungkin tidak tepat. Dan ternyata, mencari di frame masih bukan fitur. Anda dapat mengikuti utas milis pengguna FFmpeg ini untuk info lebih lanjut:

Anda dapat menggunakan -vf selectuntuk pemilihan bingkai yang akurat (seperti -vf 'select=gte(n\,100)'melewatkan 100 frame pertama)

slhck
sumber
3
untuk video dengan frame jatuh (mis. 29,97fps) yang lebih dari 10 menit; bagaimana Anda menghitung secara akurat waktu untuk kerangka tertentu?
GFoley83
yang select=gte(n\,100)metode bekerja tapi mencari yang memakan kinerja. Jika Anda menguji dengan menyandikan hanya 30 frame pada satu waktu, Semakin jauh ke dalam video saya mulai, semakin lama ffmpeg diperlukan untuk menyelesaikan karena pencarian.
Adam Grant
6

Pilihan

-vf select = "antara (n \, start_frame_num \, end_frame_num ), setpts = PTS-STARTPTS"
misalnya,

-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

memotong video dari (termasuk) ke-200 hingga (termasuk) bingkai ke-300, penghitungan urutan dimulai dari 0.

Nuo Chen
sumber