2012-01-26 22 views
6

C içinde bir video dosyasının kodunu çözmek için ffmpeg kullanıyorum. Çözmekte olduğum geçerli karenin ya da çerçevenin zaman damgasını almam için mücadele ediyorum. Fps ve kare zaman damgasını temel alarak tahmini bir karenin nasıl hesaplanacağını gösteren çok sayıda yazı okudum, ancak bunlardan herhangi birini alamıyorum.ffmpeg c/C++ kare sayısı veya zaman damgası ve fps olsun

Ben gerekenler: video dosyasının fps, mevcut çerçevenin zaman damgası veya çerçeve hayır (hesaplanmaz) Ben ne

: Ben kullanarak videonun süresini almak mümkün

pFormatCtx->duration/AV_TIME_BASE 

Şu anda onları işlediğim kareleri sayıyorum ve geçerli bir kareyi sayıyorum, bu uzun süreli çalışmayacak. ben denedim her dere için çalışmış olmasına rağmen, ben bu bütün akışları için çalışmayabilir okudum

pFormatCtx->streams[currentStream->videoStream]->nb_frames 

kullanarak dosya için toplam kare sayısı elde edebilir.

time_base.num ve time_base.den değerlerini ve packageet.pts kullanmayı denedim, ancak bunlardan elde ettiğim değerler hakkında hiçbir fikrim yok, bu yüzden daha iyi olanları anlamanız gerekebilir. değerler.

Bu değerlerin nasıl alınacağı ile ilgili örnekler gösteren herhangi bir kaynak bilen var mı?

cevap

4

Bu URL'ye, puan değerleri nasıl mantıklı olanları almak mantıklı ve yapamaz neden anlatılır: Burada An ffmpeg and SDL Tutorial by Dranger

rehberlik verdiği linke gelen bir uzman tam olarak ne çerçevenin açısından aradığınız sayılar ve zaman damgaları. Bu sizin için yararlı görünüyor, o zaman daha iyi anlaşılması için belgenin daha okumak isteyebilirsiniz: Yani

en bir film vardı, ve çerçeveler gibi sergilendi diyelim: IBB P. Şimdi, gerek görüntülemeden önce P'deki bilgileri bilmek B çerçevesi. Bu nedenle, çerçeveler şu şekilde depolanabilir: I P B B. Bu nedenle, her bir karede bir kod çözme zaman damgası ve bir sunum zaman damgası var. Kod çözme zaman damgası, bir şeyin kodunu çözmek için 'a gereksinim duyduğumuzda bize bildirir ve sunum zaman damgası, bir şey görüntülemesi gerektiğinde bize bilgi verir. Yani, bu durumda, bizim akışı böyle görünebilir: biz oyun içinde B Çerçeve içeren akışı olduğunda

PTS: 1 4 2 3 
DTS: 1 2 3 4 
Stream: I P B B 

Genellikle PTS ve DTS sadece farklı olacaktır.

av_read_frame(), 'dan bir paket aldığımızda, bu paketindeki bilgilerin PTS ve DTS değerlerini içerecektir. Ama bizim gerçekten istediğimiz, yeni çözülmüş ham çerçevemizin PTS'idir, bu yüzden ne zaman görüntüleneceğini biliyoruz.

Neyse ki, FFMpeg bunu bir bağlantı tek cevap olduğu için

+0

Bu cevap kaldırılması için işaretlendi() av_frame_get_best_effort_timestamp aracılığıyla alabilirsiniz bir "en iyi çaba" damgası, bize besler.Bu cevabı genişletebilir misiniz? Böylece, okuyucunun bağlantılı web sayfasına tıklaması gerekmeden soruya bir cevap verir. – josliber

+0

Bir bağlantıdan daha fazlasını sağlamak için bu gerekliliğe uymaya çalışacağım, ancak iki şeye dikkat etmeliyim: İlk olarak, "bu değerleri nasıl alacağına dair örnekleri gösteren kaynaklar" sorusu sorulur. daha uzun bir şey yerine alink; (2) üç yıl önce, cevabın, sorunun cevabın seçilmesinden bu yana ne istediği anlaşılıyordu (SADECE cevaptı. Muhtemelen üç yıl boyunca asıl soru soran ve muhtemelen başka bir ziyaretçiye yardım ediyordu.) – Beel

+0

@Beel ya da uzun bir süredir yardımcı olmuyor, Yığın Taşması'nın [cevap politikası] (https://stackoverflow.com/help/how-to-answer) sadece bir bağlantı sağlayan cevapların eksiksiz cevaplar olmadığını, biçimlendirme ve sadece metin bıraktılar, yine de soruyu cevaplamalılar. –