2010-09-22 33 views
3

我正在尋找一個簡單的c/C++ lib,它允許將視頻的第一幀作爲uchar數組提取。並有一個簡單的功能來訪問下一個。簡單的逐幀視頻解碼器庫

我知道的ffmpeg但它requiere用包之類的東西玩,我很驚訝,沒有一個地方在網絡上我能找到一個lib,允許這樣的:

視頻V = openVideo(」路徑」); uchar * data = v.getFrame(); v.nextFrame();

我只需要提取視頻的幀使用它作爲紋理...無需後或任何重新編碼...

當然

東西會比讀儘可能最格式將是巨大的,一些在建的libavcodec例如,p

而且我使用的是Windows 7

謝謝!

+0

libavcodec是ffmpeg項目的一部分。 – crazyscot 2010-09-22 19:28:19

回答

3

下面是一個例子用的OpenCV:

#include <cv.h> 
#include <highgui.h> 

int 
main(int argc, char **argv) 
{  
    cv::VideoCapture capture(argv[1]); 
    if (capture.grab()) 
    { 
     cv::Mat_<char> frame; 
     capture.retrieve(frame); 
     // 
     // Convert to your byte array here 
     // 
    }  
    return 0; 
} 

這是未經測試,但我拆散它從一些現有的工作代碼,因此它不應該帶你長得到它的工作。

cv::Mat_<unsigned char>本質上是一個字節數組。如果你真的需要的東西,這是明確unsigned char *型的,那麼你可以使用

的malloc適當大小的空間,並遍歷矩陣可以使用像素位置(cv::Mat_::at())或迭代器cv::Mat轉換爲字節數組( cv::Mat_::begin()和朋友)。

有很多原因,庫很少暴露圖像數據作爲一個簡單的指針,如:

  • 這意味着整個圖像必須佔用內存連續空間。處理大圖像時這是一個大問題
  • 它需要提交數據的某種順序(像素與非平面 - 是散佈或單獨存儲的RGB平面?)並降低了靈活性取消引用指針是一種導致錯誤(緩衝區溢出等)。

所以,如果你想要你的指針,你必須爲它做一些工作。

0

使用DirectShow。這裏有一篇文章:http://www.codeproject.com/KB/audio-video/framegrabber.aspx 有DirectShow的附加組件來解碼不同的視頻格式。這裏的網站,你可以搶免費DirectShow過濾器包解碼不直接由DirectShow的支持一些常見的格式之一:http://www.free-codecs.com/download/DirectShow_FilterPack.htm

+0

我正是用這個問題搜索的,因爲我正在尋找DirectShow的替代品。它是跨平臺的嗎?它可以在盒子裏玩奇怪的格式嗎?嗯,不是嗎?我會檢查free-codecs.com網站,看看我是否可以停止「pSampleGrabber-> GetConnectedMediaType失敗」......如果有幫助,我甚至可以贊成這個答案。因爲我所需要的不能是OpenCV。 – 2013-04-11 08:21:17