2010-06-13 12 views
12

का उपयोग कर av_seek_frame के साथ FFMPEG की तलाश में मैं av_seek_frame() फ़ंक्शन को निर्दिष्ट बाइट स्थिति पर जाने का प्रयास कर रहा हूं। मैं अपने आवेदन के लिए एक फ्रेम सटीक मांग तंत्र को कार्यान्वित कर रहा हूं, और जिस तरह से मैं इसे देखता हूं, मैं पूरी वीडियो फ़ाइल स्कैन करूंगा, और एक स्ट्रक्चर में प्रत्येक कीफ्रेम के लिए बाइट पोजिशन स्टोर करूंगा। मुझे पता चला कि वर्तमान बाइट स्थिति कहां प्राप्त करें: AVPacket.pos। मैं अब इस तरह av_seek_frame के साथ इस स्थिति का परीक्षण:समस्या: बाइट स्थिति

av_seek_frame(pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE); 

बहरहाल, यह सही काम करने के लिए, जब मैं av_read_frame फोन, यह सिर्फ फ्रेम 23. साथ शुरू होता है अगर मैं न माँगें नहीं लगता है, यह पर शुरू होता है फ्रेम 1.

+0

समस्या है क्योंकि आप एक फ्रेम की तलाश करने की कोशिश कर रहे हैं जो एक महत्वपूर्ण फ्रेम नहीं है? – dmazzoni

+0

हाय डैमैज़ोनी, नहीं, मैंने यह सुनिश्चित किया कि स्थिति एक महत्वपूर्ण फ्रेम थी। मैं इसमें जोड़ सकता हूं, कि यह एक एच 264 वीडियो है। –

उत्तर

9

रुचि रखने वालों के लिए, मुझे समाधान मिला। गुगलिंग के घंटों और रिवर्स इंजीनियरिंग के कुछ सरल रूप के बाद, मैंने पाया कि खुले वीडियो के बाइट स्थान को कैसे प्राप्त करें और सेट करें। AVFormatContext.pb.pos

उदाहरण के लिए::

int64_t byteposition = pFormatCtx->pb->pos; 

फ़ाइल स्थिति निर्धारित करने के लिए:

फ़ाइल स्थिति प्राप्त करने के लिए url_seek (AVFormatContext.pb, स्थिति, SEEK_SET);

उदाहरण के लिए

:

url_seek(pFormatCtx->pb, 27909056, SEEK_SET); 

मत भूलना बफ़र्स फ्लश करने के लिए यदि आप चलाते समय स्थान बदल जाते हैं। यदि आप पहली बार av_read_frame करने से पहले ऐसा करते हैं, तो फ्लशिंग आवश्यक नहीं है।

सधन्यवाद, निक Verlinden

3

libav के हाल के संस्करणों में, url_seek एक आंतरिक समारोह किया गया है। अब किसी को निम्नलिखित फ़ंक्शन का उपयोग करना चाहिए:

/** 
* fseek() equivalent for AVIOContext. 
* @return new position or AVERROR. 
*/ 
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); 
संबंधित मुद्दे