Saya ingin mencari FFmpeg perintah yang cepat dan akurat. Saya menemukan ini .
Solusinya adalah kita menerapkan -ss
input (pencarian cepat) dan output (pencarian akurat). Tetapi: Jika pencarian input tidak akurat, bagaimana kita bisa yakin bahwa posisi pencarian itu akurat?
Sebagai contoh: Jika kita ingin mencari ke 00:03:00, perintahnya adalah seperti:
ffmpeg -ss 00:02:30 -i <INPUT> ... -ss 00:00:30 <OUTPUT>
Yang pertama -ss
akan mencari ke tempat lain, bukan 00:02:30
, katakan 00:02:31
. Dan setelah menerapkan pencarian kedua, hasil akhirnya akan 00:03:01
- bukan yang kita inginkan. Apakah itu benar?
Di mana -ss
mencari pertama ? Apakah itu mencari keyframe yang paling dekat 00:02:30
?
Jika demikian, inilah pemikiran saya — perbaiki saya jika saya salah: setelah pencarian pertama, kami mendapatkan cap waktu hasilnya (dalam contoh ini:) 00:02:31
, maka kami menerapkan pencarian kedua dengan waktu yang tepat, dalam hal ini 00:00:29
.
Pertanyaannya adalah: Bagaimana cara mendapatkan cap waktu dari hasil pencarian pertama?
ffprobe
. Jika tidak, format perantara apa pun dapat dilakukan, misalnya ProRes 422, DNxHD, yang secara visual lossless dan intra-frame saja. Atau Anda menggunakan sesuatu seperti HuffYUV, dll. Tetapi kemudian Anda akan kehilangan aspek "cepat" lagi, tentu saja.Unrecognized option 'select_streams'
select_streams
opsi ditambahkan pada Oktober 2012 . :) Anda bisa melakukannya tanpa itu tetapi kemudian Anda akan mendapatkan informasi untuk frame audio juga, dicampur di antaranya.Saya mengerti pertanyaan ini sudah berumur beberapa tahun, tetapi versi terbaru dari ffprobe memiliki kemampuan untuk melewati bingkai . Anda dapat masuk
-skip_frame nokey
untuk melaporkan info hanya pada frame kunci (I-frame). Ini dapat menghemat banyak waktu! Pada file MP4 2GB 1080p, dibutuhkan waktu 4 menit tanpa bingkai loncatan. Menambahkan paramter lewati hanya membutuhkan waktu 20 detik.Perintah:
ffprobe -select_streams v -skip_frame nokey -show_frames -show_entries frame = pkt_pts_time, pict_type D: \ test.mp4
Hasil:
Jadi hasilnya hanya akan berisi info tentang bingkai kunci.
sumber
Membangun jawaban slhck , inilah fungsi bash yang akan mengembalikan keyframe terdekat yang terjadi SEBELUM
N
detik.Ini juga digunakan
-read_intervals
untuk memastikan bahwa ffprobe hanya mulai mencari frame kunci Anda 25 detik sebelumN
detik. Trik ini dan memiliki awk keluar ketika stempel waktu ditemukan sangat mempercepat.contoh penggunaan:
Saya menggunakan ini untuk memotong file video tanpa kembali encoding. Karena Anda tidak dapat menambahkan kerangka kunci baru tanpa pengodean ulang, saya menggunakan
ffnearest
untuk mencari kerangka kunci sebelum saya ingin memotong. Ini sebuah contoh:Perhatikan bahwa untuk contoh itu Anda mungkin perlu mengubah format apa yang dilewatkan di
-ss
param jika Anda mencari lebih dari 60 detik pertama.(Secara menjengkelkan, memberitahu ffmpeg untuk mencari tepat ke cap waktu keyframe tampaknya membuat ffmpeg mengecualikan keyframe dalam output, tetapi mengurangi 0,5 detik dari cap waktu aktual keyframe melakukan trik. Untuk bash, Anda perlu menggunakan
bc
untuk mengevaluasi ekspresi dengan desimal. , tetapi dalam-ss 00:00:$[$(ffnearest input.mkv 28)-0.5]
karya zsh .)sumber
jika Anda ingin mendapatkan informasi dari frame I, Anda dapat menggunakan
sumber