3

ビデオの最初のフレームを uchar 配列として抽出できる単純な c/c++ ライブラリを探しています。そして、次のものにアクセスするための簡単な機能があります。

私はFFMPEGを知っていますが、パケットなどで遊ぶ必要があり、ネット上のどこにも次のようなものを許可するライブラリが見つからないことに驚いています:

ビデオ v = openVideo("パス"); uchar* データ = v.getFrame(); v.nextFrame();

ビデオのフレームを抽出してテクスチャとして使用するだけで済みます...後で再エンコードする必要はありません...

もちろん、可能な限り多くの形式を読み取るものは素晴らしいでしょう。たとえば、libavcodec に基づいて構築されたもの;p

そして、私はWindows 7を使用しています

ありがとう!

4

3 に答える 3

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>基本的にバイト配列です。明示的に type の何かが本当に必要な場合unsigned char *は、適切なサイズのスペースを malloc し、次を使用して行列を反復処理できます。

ピクセル位置 ( ) または反復子 (およびその仲間)cv::Matを使用して、a をバイト配列に変換できます。cv::Mat_::at()cv::Mat_::begin()

ライブラリが画像データを単純なポインターとして公開することがめったにないのには、次のような多くの理由があります。

  • これは、イメージ全体がメモリ内の連続したスペースを占有する必要があることを意味します。大きな画像を扱う場合、これは大きな問題です
  • データの特定の順序をコミットする必要があり (ピクセル対非平面 - RGB プレーンは散在して保存されているか、個別に保存されていますか?)、柔軟性が低下します。
  • ポインターの逆参照は、バグ (バッファー オーバーランなど) の原因となります。

したがって、ポインターが必要な場合は、少し作業を行う必要があります。

于 2011-02-10T10:20:06.983 に答える
1

OpenCV を使用できます。これは非常にシンプルで、サイトhttp://opencv.willowgarage.com/wiki/に便利なマニュアルがあります。

于 2011-02-10T10:02:47.287 に答える
0

DirectShowを使用します。記事は次のとおりです。http://www.codeproject.com/KB/audio-video/framegrabber.aspx さまざまなビデオ形式をデコードするためのDirectShowの「アドオン」があります。これは、無料のDirectShowフィルターパックを入手して、DirectShowで直接サポートされていないいくつかの一般的な形式をデコードできるサイトの1つです:http://www.free-codecs.com/download/DirectShow_FilterPack.htm

于 2010-09-22T15:41:54.113 に答える