Bagaimana cara mengekstrak stempel waktu yang terkait dengan bingkai, ekstrak ffmpeg dari video dengan opsi -r?

12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

Apakah perintah yang saya gunakan untuk mengekstrak bingkai dan itu berfungsi seperti yang saya harapkan. Namun saya juga ingin melihat cap waktu bingkai. Apa pun ketepatannya. 100 milidetik cukup baik untukku. Bisakah ffmpeg melakukan ini?

Memberikan detail tambahan,

Ketika saya menjalankan perintah di atas saya mendapatkan sekitar 100 JPEG, saya kira ada korespondensi 1 banding 1 (atau banyak ke 1) antara JPEG dan frame video ini. Saya ingin tahu cap waktu bingkai yang dihasilkan sebagai gambar JPEG 'i'.

Selain itu saya mencoba ffprobe tapi saya menemukan laporannya bahkan durasi video tidak akurat :(

Srini
sumber
Seperti apa? AFAIK jpeg tidak memiliki metadata seperti itu. Stempel waktu EXIF ​​adalah untuk capturewaktu.
Rajib
Tentu JPEG tidak memiliki metadata, tetapi mp4 mungkin. Bisakah saya mengarahkan ffmpeg untuk menariknya bersama dengan frame yang kemudian dikodekan sebagai JPEGS dan membuang cap waktu dalam file?
Srini
Harap sertakan ffmpegoutput konsol lengkap dari perintah Anda.
llogan
ffprobe dapat memberi Anda informasi cap waktu dari aliran video mp4. Apakah Anda bertanya seolah-olah bingkai dapat digandakan atau dijatuhkan lalu apa korespondensi dengan cap waktu mp4 asli? Dalam hal ini saya akan mengeksplorasi meningkatkan pengaturan verbosity untuk melihat apakah Anda bisa mendapatkan bingkai demi bingkai selama eksekusi. Bisakah Anda memperluas apa yang Anda maksud dengan "cap waktu yang dikaitkan dengan bingkai".
dstob
@dstob Stempel waktu yang terkait dengan bingkai adalah stempel waktu presentasi dari video input, yaitu kapan setiap frame harus ditampilkan, relatif terhadap awal video.
slhck

Jawaban:

13

Apa yang dapat Anda lakukan adalah "mensimulasikan" proses penulisan gambar dengan memfilter dengan fpsfilter, lalu menggunakan ffprobeuntuk menunjukkan cap waktu dari frame yang dihasilkan. Ini berarti bahwa pada 25 fps, bingkai ke-50 (seperti gambar ke-50 Anda) akan memiliki PTS 2,00 detik.

Anda melakukannya seperti ini:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

Akan menghasilkan:

0
0.04
0.08
0.12
0.16
...

Ini adalah cap waktu untuk setiap gambar keluaran. Anda sebenarnya dapat menggabungkan daftar bingkai dan cap waktu:

ls -1 image - *. jpeg> images.txt
ffprobe -f lavfi -i "movie = input.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -dari csv = p = 0> frames.txt
rekatkan images.txt frames.txt> gabungan.txt

Akan membuat file dengan:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

Perhatikan bahwa ini dapat menghasilkan garis asing jika ada terlalu banyak bingkai atau terlalu banyak garis keluaran info. Sepertinya sedikit tidak akurat di sana.

slhck
sumber
Apakah ini stempel waktu sehubungan dengan framerate konstan yang ditempatkan pada output atau korespondensi dari jpeg yang dikeluarkan dengan stempel waktu mp4 asli yang bisa berupa framerate dan memiliki nilai stempel waktu?
dstob
Stempel waktu ini didasarkan pada framerate output yang diminta. Ini terkait dengan gambar output dan juga frame input video asli dari foto-foto itu — hanya ada satu basis waktu. Ini berfungsi karena ketika mengubah framerate, ffmpeg akan (tentu saja) tidak memutar video lebih cepat, tetapi "meregangkan" waktu presentasi setiap frame, dan menjatuhkan frame yang tidak dibutuhkan.
slhck
Mengapa hanya ada satu basis waktu ketika Anda membuat basis waktu keluaran secara manual? Tentu saja ini tidak selalu menjadi masalah, tetapi pada video 60 fps pertama yang saya lakukan, ffmpeg baru saja membuat basis waktu sendiri tanpa mengacuhkan stempel waktu dari input.
dstob
Tidak yakin saya mengerti apa yang Anda maksud. ffmpeg memilih sebagai basis waktu input apa pun yang diuraikan sebagai basis waktu file input pertama . Anda tentu saja dapat juga memberitahu ffmpeg untuk membuang stempel waktu masukan dengan -vsync drop, tetapi itu terjadi setelah pemfilteran, IIRC.
slhck