問題描述:關(guān)鍵幀提取后,將會(huì)得一序列關(guān)鍵幀的幀號(hào),然后需要把這些幀保存起來,以便于瀏覽和管理. 通過opencv里的VideoCapture的函數(shù)set(CV_CAP_PROP_POS_FRAMES,nextFrameNumber),定位到具體的幀號(hào),但最終讀取的并不是對(duì)應(yīng)幀的圖像. 問題出現(xiàn)的原因: Opencv底層是通過ffmpeg讀取視頻.其中定位主要用av_seek_frame()來定位frame的位置. int av_seek_frame(AVFormatContext *s,int stream_index,int64_t timestamp,int flags)其中最后一個(gè)參數(shù)有 AVSEEK_FLAG_BACKWARD = 1 // seek backward AVSEEK_FLAG_BYTE = 2 // seeking based on position in bytes AVSEEK_FLAG_ANY = 4 // seek to any frame,even non key-frames. ffmpeg默認(rèn)的是選取關(guān)鍵幀,opencv里面這個(gè)函數(shù)的參數(shù)flag是0. 因而,進(jìn)行定位時(shí),若下一幀不是關(guān)鍵幀,進(jìn)行讀取時(shí)會(huì)出跳躍現(xiàn)象. 將參數(shù)改為AVSEEK_FLAG_ANY,雖然可以解決跳躍現(xiàn)象,讀取任何幀圖像. 但是將會(huì)出現(xiàn)花屏現(xiàn)象,因?yàn)閹瑘D像解碼是需要利用關(guān)鍵幀的圖像進(jìn)行幀間的解碼, 若讀取幀圖像時(shí),其對(duì)應(yīng)關(guān)鍵幀沒有被讀取解碼,將只會(huì)對(duì)該幀進(jìn)行幀內(nèi)解碼得到花屏圖像. 如何才能解決跳躍現(xiàn)象,但不產(chǎn)生花屏圖像? 解決思路:讀取下一幀號(hào)最相近且前面的關(guān)鍵幀,然后一幀幀的讀取視頻,直到讀到下一幀的幀號(hào)為止. 將Opencv2.3.1里面的cap_ffmpeg_impl.cpp里面bool CvCapture_FFMPEG::setProperty( int property_id, double value )函數(shù)改成如下實(shí)現(xiàn)方式, 即可達(dá)到準(zhǔn)確定位的效果.
|
|