Finally the solution was to set a Linker Flag to /OPT:NOREF which is not optimizing your references. You could find this in the Visual Studio Settings by:
Configuration Properties->Linker->Optimization->References
#include "opencv2\imgproc\imgproc.hpp"
#include <iostream>
#include <windows.h>
#include "vlc\libvlc.h"
#include "vlc\vlc.h"
#define WIDTH 800
#define HEIGHT 600
using namespace cv;
struct ctx
{
Mat* 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;
ReleaseMutex( ctx->mutex );
}
int main()
{
libvlc_instance_t *vlcInstance;
libvlc_media_player_t *mp;
libvlc_media_t *media;
const char *const vlc_args[] = {
"--no-audio", /* skip any audio track */
"--no-xlib", /* tell VLC to not use Xlib
"-I",
"dummy",
"--ignore-config",
"--extraintf=logger",
"--verbose=2", */
};
int vlc_argc = sizeof(vlc_args)/sizeof(vlc_args[0]);
//libvlc_instance_t* libvlc_new ( int argc, const char *const *argv )
//用於初始化一個libvlc的實例,argc表示參數的個數,argv表示參數,返回創建的實例若當發生錯誤時返回NULL
vlcInstance = libvlc_new( vlc_argc, vlc_args );
if( vlcInstance == NULL ){
std::cout<<"Create Media Stream Error"<<std::endl;
return 0;
}
//LIBVLC_API libvlc_media_t* libvlc_media_new_location( libvlc_instance_t *p_instance, const char *psz_mrl )
//使用一個給定的媒體資源路徑來建立一個libvlc_media對象,參數psz_mrl為要讀取的MRL(Media Resource Location),此函數返回新建的對像或NULL.
const char *psz_mrl = "rtsp://192.168.1.150/media/video1";
media = libvlc_media_new_location( vlcInstance, psz_mrl );
if( media == NULL ){
std::cout<<"Media Stream is Null"<<std::endl;
return 0;
}
//LIBVLC_API libvlc_media_player_t* libvlc_media_player_new_from_media( libvlc_media_t *p_md )
//根據給定的媒體對象創建一個播放器對象
mp = libvlc_media_player_new_from_media( media );
// LIBVLC_API void libvlc_media_release( libvlc_media_t *p_md )
//減少一個libvlc_media_t的引用計數,如果減少到0時,此函數將釋放此對象(銷毀).它將發送一個libvlc_MediaFreed事件到所有的監聽者那裡。如果一個libvlc_media_t被釋放了,它就再也不能使用了。
libvlc_media_release(media);
struct ctx* context = (struct ctx*)malloc( sizeof(*context) );
context->mutex = CreateMutex( NULL, false, NULL );
context->image = new Mat( HEIGHT, WIDTH, CV_8UC3 );
context->pixels = (unsigned char *)context->image->data;
//設定Callback Function複製影像資訊,可藉由libvlc_video_set_format和libvlc_video_set_format_callbacks設定解碼資訊
libvlc_video_set_callbacks( mp, lock, unlock, display, context );
//設定影像解碼資訊
const char *chroma = "RV24";
unsigned width = WIDTH;
unsigned height = HEIGHT;
unsigned pitch = WIDTH*24/8;
libvlc_video_set_format( mp, chroma, width, height, pitch);
// LIBVLC_API int libvlc_media_player_play( libvlc_media_player_t *p_mi )
//開始播放串流影片
libvlc_media_player_play(mp);
Mat img;
while( true ){
WaitForSingleObject( context->mutex, INFINITE );
img = context->image->clone();
ReleaseMutex( context->mutex );
cv::imshow("test",img);
std::cout<<"Image "<<img.cols<<std::endl;
// cv::imwrite("cam.jpg", img);
cv::waitKey( 40);
}
libvlc_media_player_stop( mp );
libvlc_media_player_release( mp );
libvlc_release( vlcInstance );
return 0;
}
Aucun commentaire:
Enregistrer un commentaire