0

を使用してネットワーク ストリームからフレームを読み取りlibvlc、これらのフレームに を使用して何らかの処理を適用しようとしていopencvます。これは、フレームを取得するために使用しているコードです。

struct ctx
{
    IplImage* image;
    HANDLE mutex;
    uchar*    pixels;
};

void *lock(void *data, void**p_pixels)
{
    struct ctx *ctx = (struct ctx*)data;
    WaitForSingleObject(ctx->mutex, INFINITE);
    *p_pixels = ctx->pixels; 
    return NULL;

}
void display(void *data, void *id)
{
    (void) data;
    assert(id == NULL);
}
void unlock(void *data, void *id, void *const *p_pixels){
    struct ctx *ctx = (struct ctx*)data;
    // VLC just rendered the video, but we can also render stuff 
    uchar *pixels = (uchar*)*p_pixels;
    cvShowImage("image", ctx->image);
    ReleaseMutex(ctx->mutex);
    assert(id == NULL); // picture identifier, not needed here 
}

int main()
{
    cvNamedWindow("image", CV_WINDOW_AUTOSIZE);
    libvlc_media_t* media = NULL;
    libvlc_media_player_t* mediaPlayer = NULL;
    //char const* vlc_argv[] = {"--plugin-path", "C:\\Users\\Oscar\\Documents\\libvlc\\vlc-1.1.4"};
    libvlc_instance_t* instance = libvlc_new(0,NULL);
    mediaPlayer = libvlc_media_player_new(instance);
    media = libvlc_media_new_location(instance, "rtsp://134.202.84.79:554/user=a&password=abcdef&channel=6&stream=0.sdp/");

    struct ctx* context = ( struct ctx* )malloc( sizeof( *context ) );
    context->mutex = CreateMutex(NULL, FALSE,NULL);
    //context->image = cvCreateImage(cvSize(libvlc_video_get_height(mediaPlayer), libvlc_video_get_width(mediaPlayer)), IPL_DEPTH_8U, 4);

    context->image = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 4);
    context->pixels = (unsigned char *)context->image->imageData;

    libvlc_media_player_set_media( mediaPlayer, media);
    libvlc_video_set_callbacks(mediaPlayer, lock, unlock, display, context);
    libvlc_video_set_format(mediaPlayer, "RV32", 640, 480, 640*4);
    libvlc_media_player_play(mediaPlayer);


    while(true)
    {
        if (waitKey(30)==27)
        {
            break;
        }
    }
    return 0;
}

問題は、デバッグモードで作業しているときにこれが正常に機能することですが、リリースモードに切り替えると、次のように表示されます。

プロシージャ エントリ ポイント cvCreateImage がダイナミック リンク ライブラリ libvlc.dll に見つかりませんでした。

リンカーの最適化フラグも変更しようとしましたが、問題はまだここにあります。

4

2 に答える 2

0

私はそれを修正したようです。VS 2008 のコンパイルの問題に関する別の投稿 (デバッグではすべてがうまく機能します。切り替えてリリース モードですべてをビルドすると、行でクラッシュします)。/OPT彼らがリンカー フラグを から/OPT:REFに調整していたことに気付きました。これにより、彼らが抱えてい/OPT:NOREFた別の問題が修正されたようです。

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、[設定] > [Visual C++ プロジェクトのプロパティ] を参照してください。
  2. リンカー フォルダーを選択します。
  3. [コマンド ライン] プロパティ ページを選択します。
  4. [追加オプション] にオプションを入力します。/OPT:NOREF

マイクロソフト ドキュメント:

参照 | NOREF /OPT:REF は参照されない関数やデータを削除しますが、/OPT:NOREF は参照されない関数やデータを保持します。

LINKデフォルトでは、参照されていないパッケージ化された関数を削除します。オプションを指定してコンパイルされたオブジェクトには、パッケージ化された関数 (COMDAT) が含まれ/Gyます。この最適化は、推移的な COMDAT の排除と呼ばれます。このデフォルトをオーバーライドして、参照されていない COMDAT をプログラム内に保持するには、 を指定します/OPT:NOREF。このオプションを使用して/INCLUDE、特定のシンボルの削除をオーバーライドできます。

于 2015-06-01T11:41:39.400 に答える
0

過剰摂取で同様の問題が発生しました(私のアプリケーションはlibVLC.dllで過剰摂取手順を見つけようとしています)。

この問題の原因はわかりませんが、次の方法で解決できました。

VLC に付属の .lib ファイルを使用する代わりに、dll ファイルから lib を生成する方法について次の手順に従いました。

そもそもなぜそれが発生するのかわかりませんが、このライブラリを使用すると問題が解決しました。

于 2013-01-29T04:51:14.997 に答える