-R seçeneğiyle bir videodan kare ffmpeg özütleriyle ilişkili zaman damgalarını nasıl ayıklayabilirim?


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

Çerçeveleri ayıklamak için kullandığım komut ve beklediğim gibi çalışıyor. Ancak çerçevelerin zaman damgalarına da bakmak istiyorum. Hangi hassasiyette olursa olsun. 100 milisaniye benim için yeterli. Ffmpeg bunu yapabilir mi?

Ek ayrıntılar sağlamak,

Yukarıdaki komutu çalıştırdığımda yaklaşık 100 JPEG alıyorum, sanırım bu JPEG'ler ve videonun kareleri arasında 1'e 1 (ya da 1'e 1) yazışma var. Bir JPEG görüntüsü 'i' olarak çıkan karenin zaman damgasını bilmek istiyorum.

Ayrıca ffprobe denedim ama video süresini bile yanlış raporlar buluyorum :(


Ne gibi? AFAIK jpeg'in böyle bir meta verisi yoktur. EXIF zaman damgası capturezaman içindir.
Rajib

JPEG'nin meta verisi olmadığından emin olun, ancak mp4 olabilir. Ffmpeg'i daha sonra JPEGS olarak kodladığı karelerle birlikte çekmeye ve zaman damgalarını bir dosyaya dökmeye yönlendirebilir miyim?
Srini

Lütfen ffmpegkomutunuzun tüm konsol çıktısını ekleyin.
llogan

ffprobe, mp4 video akışından zaman damgası bilgilerini verebilir. Çerçevelerin çoğaltılabileceğini veya düşürülebileceğini mi soruyorsunuz, o zaman orijinal mp4 zaman damgalarına uygunluk nedir? Bu durumda, yürütme sırasında kare kare alıp alamayacağınızı görmek için ayrıntı ayarlarını artırmayı keşfedeceğim. "Çerçevelerle ilişkilendirilmiş zaman damgaları" ile ne demek istediğinizi genişletebilir misiniz?
14:14, dstob

@dstob Karelerle ilişkili zaman damgaları, giriş videosunun sunum zaman damgalarıdır, yani videonun başlangıcına göre her bir karenin ne zaman gösterilmesi gerektiğidir.
14:20, slhck

Yanıtlar:


13

Yapabileceğiniz şey, fpsfiltreyle filtreleyerek ve ardından ffprobeoluşturulan karelerin zaman damgalarını göstermek için görüntü yazma işlemini "simüle etmektir" . Bu, 25 fps'de 50. karenin (50. resminiz gibi) 2.00 saniyelik bir PTS'ye sahip olacağı anlamına gelir.

Bunu şöyle yapın:

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

Çıktı olacak:

0
0.04
0.08
0.12
0.16
...

Bunlar her çıktı görüntüsü için zaman damgalarıdır. Aslında çerçeve listesini ve zaman damgalarını birleştirebilirsiniz:

ls -1 resim - *. jpeg> images.txt
ffprobe -f lavfi -i "film = giriş.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -of csv = p = 0> frames.txt
images.txt kareleri yapıştırın.txt> combined.txt

Şununla bir dosya oluşturur:

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

Çok fazla kare veya çok fazla bilgi çıkışı satırı varsa, bunun yabancı satırlara neden olabileceğini unutmayın. Orada biraz yanlış görünüyor.


Bu, çıktı üzerine yerleştirilen sabit bir kare hızına veya çıkış jpeglerinin herhangi bir kare hızı ve herhangi bir zaman damgası değerine sahip olabilecek orijinal mp4 zaman damgalarına karşılık gelmesi ile ilgili zaman damgası mı?
dstob

Bu zaman damgası, istenen çıktı karesine dayanır. Hem çıktı resimlerine hem de bu resimlerin geldiği orijinal giriş video karelerine ilişkindir - yalnızca bir zaman tabanı vardır. Bu, kare hızını değiştirirken, ffmpeg (elbette) videoyu daha hızlı oynatmayacak, ancak her karenin sunum süresini "uzatacak" ve gereksiz kareleri bırakacaktır.
slhck

Çıktı zaman tabanını manuel olarak oluştururken neden yalnızca bir zaman tabanı olması gerekiyor? Bu her zaman böyle olmayacak, ancak ilk 60 fps videoda fırlattım, ffmpeg girişin zaman damgalarını yok sayarak kendi zaman tabanını oluşturdu.
dstob

Tam olarak ne aldığınızı anladığımdan emin değilim. ffmpeg , ilk girdi dosyasının zaman tabanı olarak ayrıştırdığı her şeyi girdi zaman tabanı olarak seçer . Elbette ffmpeg'e giriş zaman damgalarını atmasını da söyleyebilirsiniz -vsync drop, ancak bu IIRC filtrelendikten sonra gerçekleşir.
slhck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.