Arama, FFmpeg'de saniyeler (veya milisaniye) cinsinden arama yapmayı bilen var mı? Şu anda av_read_frame() kullanarak bir videonun kareleri boyunca çalışan bir döngü var ve bu çerçevenin saniye cinsinden kaçta olması gerektiğini belirlemek istiyorum. Belirli bir noktaya gelirse, o zaman videoda daha sonraki bir noktaya bakmak istiyorum. Bu arada bir video oynatıcı değil, sadece çerçeveleri işliyor. Ive, paketten dts veya pts alabilmem gerektiğini duymuştum ama her zaman geri dönüyor. 0FFmpeg'de nasıl arama yapılır C/C++
cevap
NOT: Bu, güncel değil, hala çalışıyor olmalı ama şimdi av_seek_frame()
var.
Burada bunu yazmak ama vermedi ben
bool seekMs(int tsms)
{
//printf("**** SEEK TO ms %d. LLT: %d. LT: %d. LLF: %d. LF: %d. LastFrameOk: %d\n",tsms,LastLastFrameTime,LastFrameTime,LastLastFrameNumber,LastFrameNumber,(int)LastFrameOk);
// Convert time into frame number
DesiredFrameNumber = ffmpeg::av_rescale(tsms,pFormatCtx->streams[videoStream]->time_base.den,pFormatCtx->streams[videoStream]->time_base.num);
DesiredFrameNumber/=1000;
return seekFrame(DesiredFrameNumber);
}
bool seekFrame(ffmpeg::int64_t frame)
{
//printf("**** seekFrame to %d. LLT: %d. LT: %d. LLF: %d. LF: %d. LastFrameOk: %d\n",(int)frame,LastLastFrameTime,LastFrameTime,LastLastFrameNumber,LastFrameNumber,(int)LastFrameOk);
// Seek if:
// - we don't know where we are (Ok=false)
// - we know where we are but:
// - the desired frame is after the last decoded frame (this could be optimized: if the distance is small, calling decodeSeekFrame may be faster than seeking from the last key frame)
// - the desired frame is smaller or equal than the previous to the last decoded frame. Equal because if frame==LastLastFrameNumber we don't want the LastFrame, but the one before->we need to seek there
if((LastFrameOk==false) || ((LastFrameOk==true) && (frame<=LastLastFrameNumber || frame>LastFrameNumber)))
{
//printf("\t avformat_seek_file\n");
if(ffmpeg::avformat_seek_file(pFormatCtx,videoStream,0,frame,frame,AVSEEK_FLAG_FRAME)<0)
return false;
avcodec_flush_buffers(pCodecCtx);
DesiredFrameNumber = frame;
LastFrameOk=false;
}
//printf("\t decodeSeekFrame\n");
return decodeSeekFrame(frame);
return true;
}
Harika! Cevap için teşekkürler! Sanırım işe yarayacak gibi görünüyor. Bilgisayarıma dönüp sonuçlarımı geri yükler göndermez deneyeceğim. Avformat_seek_file hakkında bilgi sahibi değildim, av_seek_frame kullanıyordum ... Farkın herhangi bir ihtimalden ne olduğunu biliyor musun? – DRiFTy
Üzgünüm - Sadece videonun kodunu yazarak yaptım, okuyucuyu bile test etmedim. –
Martin Beckett'in yayınladığı yöntem işe yaradı ve videoda milisaniye bazında belirli bir kareye doğru ilerlememi sağladı. – DRiFTy
- 1. Arama dinamiği nasıl yapılır
- 2. J2ME: Nasıl arama yapılır?
- 3. ControlCenter'dan nasıl arama yapılır?
- 4. Arama Etkinliği - İfade - Nasıl Yapılır
- 5. MongoDB nesnenin dizideki arama nasıl yapılır
- 6. Boş bir Kotlin dizisinde nasıl arama yapılır?
- 7. chrome omnibox alan adında nasıl arama yapılır
- 8. Odt'ta nasıl arama yapılır ve değiştirilir?
- 9. Tupleların bir listesi üzerinde nasıl arama yapılır?
- 10. Android custom InputMethodService'de anahtarla nasıl arama yapılır?
- 11. Entity Framework 6'da nasıl arama yapılır?
- 12. Kullanıcı tarafından bir değişiklik arama nasıl yapılır
- 13. Lucene arama sonuçlarında gruplama nasıl yapılır?
- 14. Elasticsearch: kullanıcı_adılı bir alanda nasıl arama yapılır?
- 15. Coffeescript'te geri arama işlevi nasıl yapılır
- 16. Tüm alanlar arasında nasıl arama yapılır?
- 17. Telefonun arama düğmesine tıklamak nasıl yapılır?
- 18. mysql komut geçmişinde nasıl arama yapılır
- 19. Şemadaki devam (çağrı/cc)
- 20. [cc yaratıcısı] Karşılaştırma çalışmıyor
- 21. Adobe CC: HTML5 uzantıları nasıl çalışır?
- 22. PHP posta işlevinde CC ekleme
- 23. JQuery/CC seçici için olay işleme kodunda özellik değeri alma
- 24. Hql'de iki tarih arasında dinamik olarak nasıl arama yapılır?
- 25. İyonik 2'de otomatik tamamlama nasıl yapılır (arama-çubuğu)
- 26. LINQ'den Entity'ye iki tarih arasında nasıl arama yapılır?
- 27. Android kodu ve yerel kod arasında nasıl geri arama yapılır?
- 28. Mustache.js, şablon oluşturmayı bitirdiğinde geri arama nasıl yapılır
- 29. Belirli kategoriler için arama yapmak için googlemap nasıl yapılır
- 30. Ülke çapında Twitter Akışı Tweepy ile arama nasıl yapılır?
olmayan bir codec unutmayın sahip bir örnekten bazı kodudur "Ben sadece Çerçeve," Eğer ilk birkaç için çöp alabilirsiniz Ffmpeg tam bir çerçeve vermek için yeterli bilgi alır kadar arama sonra çerçeveler. Denediğimden beri bir süre geçti, ama AFAIK, bu hala geçerli. ffmpeg, bir oyuncu olduğunuzu varsayar ve birkaç karenin yanlış gitmesini umursamıyor ya da düz bir şekilde işliyor ve tüm çerçeveleri sırayla alıyorsunuz. Bu durumda değilse, MPEG4 gibi konularda sorun yaşayabilirsiniz. – wrosecrans
@wrosecrans Bu bilgi için çok teşekkürler. Açıkladığın gibi bir tuhaflıkla karşılaştım ve anahtar bir çerçeveyi aramaya çalışmanın yolunun gitmesi olduğunu öğrendim. Videonun bir bölümünü anahtar karesi olmayan bir parçası aramaya çalışırsanız, bir saniyeliğine biraz garip bir çıktı elde edersiniz. – DRiFTy