2009-02-02 13 views
15

मैं ffmpeg की av_seek_frame विधि का उपयोग कर एक फिल्म में खोजने का प्रयास कर रहा हूं, हालांकि मुझे यह जानने में सबसे अधिक परेशानी हो रही है कि समय-टिकट कैसे तैयार किया जाए। मान लीजिए कि मैं आगे या पीछे की फ्रेम की एक्स मात्रा खोजना चाहता हूं और मुझे पता है कि फिल्म वर्तमान में किस फ्रेम पर है, मैं इसे करने के बारे में कैसे जाउंगा?ffmpeg av_seek_frame

+0

क्या आप फ्रेम दर का उपयोग कर ऑफसेट की गणना नहीं कर सके? –

+0

जो मैं समझता हूं, उस समय ऑफसेट को टाइम_बेस इकाइयों में होना आवश्यक है, लेकिन मुझे बिल्कुल यकीन नहीं है कि इसे उन इकाइयों में कैसे परिवर्तित करें (या यहां तक ​​कि अगर मुझे ऐसा करने की ज़रूरत है)। अगर मुझे ऐसा करने की ज़रूरत है, तो मुझे यकीन नहीं है कि time_base की इकाइयां क्या हैं (सेकेंड, फ्रेम, फ्रेम प्रति सेकेंड)। 'AVSEEK_FLAG_ANY' क्या इंगित करता है यह इंगित करने के लिए –

उत्तर

8

सरल उत्तर: आपके पास एक AVFormatContext ऑब्जेक्ट होना चाहिए। इसकी duration संपत्ति आपको बताती है कि आपकी फ़ाइल कितनी देर तक 1000 से गुणा समय-स्टैंप के संदर्भ में है जिसका उपयोग av_seek_frame में किया जा सकता है, इसलिए इसे 100% के रूप में देखें। फिर आप उस वीडियो में कितनी दूर गणना कर सकते हैं, इसकी गणना कर सकते हैं।

यदि आप एक फ्रेम आगे बढ़ना चाहते हैं, तो बस av_read_frame और avcodec_decode_video पर कॉल करें जब तक कि यह got_picture_ptr को गैर-शून्य मान के साथ भरता है। Avcodec_decode_video को कॉल करने से पहले सुनिश्चित करें कि av_read_frame से पैकेट वीडियो स्ट्रीम से है। avcodec_decode_video तब AVFrame संरचना को भर देगा जिसे आप कुछ भी करने के लिए उपयोग कर सकते हैं।

13

यहाँ है कैसे मैं यह किया:

// Duration of one frame in AV_TIME_BASE units 
int64_t timeBase; 

void open(const char* fpath){ 
    ... 
    timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE)/int64_t(pCodecCtx->time_base.den); 
    ... 
} 

bool seek(int frameIndex){ 

    if(!pFormatCtx) 
     return false; 

    int64_t seekTarget = int64_t(frameIndex) * timeBase; 

    if(av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_ANY) < 0) 
     mexErrMsgTxt("av_seek_frame failed."); 

} 

AVSEEK_FLAG_ANY हर फ्रेम और न सिर्फ मुख्य-फ़्रेम करने की मांग सक्षम बनाता है।

+0

+1 – puk