FFMPEG çerçeve içi ekstraktı I, P, B çerçeveleri


4

İntra kareleri çıkarmanın ve bunları FFMPEG veya benzeri programlardan olduğu gibi korumanın bir yolu var mı? Çerçeveleri kullanarak JPEG görüntü dizisine ayıklayabileceğinizi biliyorum -f image2. Ancak bunlar, çerçevelerin her birinin tam görüntüleridir. Yalnızca hareketteki değişimin görüntüsünü dışa aktarmak istiyorum, bu nedenle P ve B karelerinin yalnızca hareketlerdeki değişimi, görüntülerin değiştirilmeyen alanını hariç tutan veya maskeleyen göstermesini sağlayacağım.

Mümkün mü?

Temel çerçeve dışa aktarma komutu kullanıyorum. Bu, bana her karenin tam çerçeveli görüntülerini, belirtilen FPS'de verir.

ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg

Çerçeveleri dışa aktarmayı umuyorum, böylece ilk karenin tam görüntü olacağı bir kareler klasörüne sahip olacağım, sonraki karede yalnızca görüntünün yeniden çizilmesi gereken görüntü verisi olacaktır. İki çerçeve arasındaki geçici fazlalığı göstermek (bu ben, P, B çerçeveleri değil mi?)

Yanıtlar:


5

Bir certin çerçeve tipini çıkarmak için seçim filtresini kullanın:

select=eq(pict_type\,<x>)

<x>aşağıdakilerden biri nerede :pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI

Yani örneğin:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4

Çıktı hakkında daha fazla bilgi için, showinfofiltreyi ekleyin :

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4


1
[in]Ve [out]ilk örnekte gerekli değildir.
slhck

Güzel cevap, ancak belirtilen her filtre için resmi belgelere link vermenizi öneririz: selectve showinfo.
llogan

bu işe devam ederken, tüm çerçeve türlerini dışa
aktaracak

1
@ ndweb Bir içi olmayan kareyi "olduğu gibi" veremezsiniz. Geçerli bir resim bilgisi yok - basitçe söylemek gerekirse, yalnızca bir sonraki resim arasındaki farkları saklayan bir P veya B makro bloğu / çerçeve. İstediğiniz şeyi yapmak için korkuyorum, MATLAB veya benzeri araçlarla kodlamak isteyebilirsiniz. En azından mevcut bir çözümün farkında değilim.
slhck

4

P ve B çerçeveleri, değişen alanların her biri için genellikle yeni görüntü verileri içermez. Aksine, resim farklı türde makro bloklara bölünür. Bazı makroblok tipleri yeni görüntü verileri içerir, ancak çoğu diğer referans resimlere ve hareket vektörlerine dayanarak içeriği hesaplar.

Tam olarak ne istediğini değil, ama bu her bir makroblokun türünü göstermek için renk kullanacak:

ffmpeg -debug vis_mb_type -i input.mp4 output.mp4

veya

ffplay -debug vis_mb_type input.mp4

Bu ayrıca size hareket vektörlerini gösterecektir:

ffplay -debug vis_mb_type -vismv 7 input.mp4

Her MB'nin renkleri hakkında daha fazla bilgi için bağlantıya bakın:

Hata ayıklama Macroblocks ve Motionsvectors FFMpeg belgeleri


Güzel bir bilgi, eğer sadece bir bütün çerçevenin sadece içi kodlanmış makro bloklardan oluşması gerekmediğini anlamak için.
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.