FFmpeg解碼H264裸流並轉換成opencv Mat
阿新 • • 發佈:2019-02-10
最近要搞一些視訊推流的事情,要解析H264裸流並且獲取opencv格式的Mat資料給演算法工程師們跑演算法.相關資源一直很難找到,經常都是太舊導致API版本都更新換代了,沒辦法讓新人或者外行[比如我]快速驗證程式碼是否可行.在參考多個部落格,前人的程式碼東拼西湊總算是寫出了這個H264解碼器.算是盡我一點點的綿薄之力對這個社群進行回饋吧.
檔案簡單介紹:
- H264Decoder.h H264Decoder.cpp:解碼器本體,輸入H264幀,(以0001開頭),輸出cv::Mat(如果遇到sps,pps則解碼失敗,當然第一次遇到的時候ffmpeg會記錄下sps,pps的資訊用於後面解碼)
- H264Decoder_jni.cpp H264Decoder.java JNI檔案以及對應java class 注意我在jni層返回的陣列中拼湊了圖片的長寬資訊進去(2*sizeof(int)),所以獲得這個陣列時需要做相應的解析.由於這邊的需求是java負責轉發資料,實際跑cv演算法還是在C++,所以有這麼一個操作,不需要的可以自行處理掉
一些坑:
ffmpeg自己有個time.h,編譯時加入標頭檔案依賴什麼的,很容易報錯找不到time相關的基本型別,解決方法百度有.
一些完善:
我會考慮製作一點H264裸流的樣例資料並且寫個簡單的呼叫example以供參考.
時間2017-07-18:已經upload了sample呼叫以及測試資料幀,沒記錯的話0號檔案是H264裸流的整合檔案,一個檔案裡面有很多幀.1號往後的檔案是以0001作為分割的H264單幀檔案,幀檔案都打包上git了