Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用libVLC打开mp4并在OpenCV C++;_C++_Opencv_Mp4_H.264_Libvlc - Fatal编程技术网

C++ 用libVLC打开mp4并在OpenCV C++;

C++ 用libVLC打开mp4并在OpenCV C++;,c++,opencv,mp4,h.264,libvlc,C++,Opencv,Mp4,H.264,Libvlc,我想播放我使用libVLC和OpenCV从IP摄像机(H264编解码器)获得的视频文件,所以我从中获取了代码,然后在vs2010中创建了项目,并将我的mp4文件放入项目文件夹(“5.mp4”)。当我开始时,我得到了以下错误: 主错误:“5.mp4”的打开失败 主要错误:无法打开您的输入 主要错误:VLC无法打开MRL“5.mp4”。查看日志以了解详细信息 这是我的密码: #include <vlc/vlc.h> #include <opencv2/opencv.hpp>

我想播放我使用libVLC和OpenCV从IP摄像机(H264编解码器)获得的视频文件,所以我从中获取了代码,然后在vs2010中创建了项目,并将我的mp4文件放入项目文件夹(“5.mp4”)。当我开始时,我得到了以下错误:

主错误:“5.mp4”的打开失败

主要错误:无法打开您的输入

主要错误:VLC无法打开MRL“5.mp4”。查看日志以了解详细信息

这是我的密码:

#include <vlc/vlc.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>

using namespace cv; 
using namespace std;

struct VideoDataStruct {
  int param;
};

int done = 0;
libvlc_media_player_t *mp;
unsigned int videoBufferSize = 0;
uint8_t *videoBuffer = 0;

 void cbVideoPrerender(void *p_video_data, uint8_t **pp_pixel_buffer, int size) {
// Locking
  if (size > videoBufferSize || !videoBuffer)
  {
    printf("Reallocate raw video buffer\n");
    free(videoBuffer);
    videoBuffer = (uint8_t *) malloc(size);
    videoBufferSize = size;
  }

   *pp_pixel_buffer = videoBuffer;
}  

 void cbVideoPostrender(void *p_video_data, uint8_t *p_pixel_buffer, int width, int height, int pixel_pitch, int size, int64_t pts) {
     // Unlocking
     //CloseHandle(hMutex);
 }

 static void handleEvent(const libvlc_event_t* pEvt, void* pUserData) {
   libvlc_time_t time;
   switch(pEvt->type)
   {
      case libvlc_MediaPlayerTimeChanged:
          time = libvlc_media_player_get_time(mp);
          printf("MediaPlayerTimeChanged %lld ms\n", (long long)time);
          break;
      case libvlc_MediaPlayerEndReached:
          printf ("MediaPlayerEndReached\n");
          done = 1;
        break;
       default:
          printf("%s\n", libvlc_event_type_name(pEvt->type));
    }
}

int main(int argc, char* argv[]) {

// VLC pointers 
libvlc_instance_t *inst;
libvlc_media_t *m;
void *pUserData = 0;
VideoDataStruct dataStruct;

// VLC options
char smem_options[1000];
// RV24
sprintf(smem_options
    , "#transcode{vcodec=RV24}:smem{"
     "video-prerender-callback=%lld,"
     "video-postrender-callback=%lld,"
     "video-data=%lld,"
     "no-time-sync},"
    , (long long int)(intptr_t)(void*)&cbVideoPrerender
    , (long long int)(intptr_t)(void*)&cbVideoPostrender
    , (long long int)(intptr_t)(void*)&dataStruct
);

const char * const vlc_args[] = {
          "-I", "dummy",            // Don't use any interface
          "--ignore-config",        // Don't use VLC's config
          "--extraintf=logger",     // Log anything
          "--verbose=1",            // Be verbose
          "--sout", smem_options    // Stream to memory
           };

// We launch VLC
inst = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);

/* Create a new item */
m = libvlc_media_new_location(inst, "5.mp4");

/* Create a media player playing environement */
mp = libvlc_media_player_new_from_media (m);

libvlc_event_manager_t* eventManager = libvlc_media_player_event_manager(mp);
libvlc_event_attach(eventManager, libvlc_MediaPlayerTimeChanged, handleEvent, pUserData);
libvlc_event_attach(eventManager, libvlc_MediaPlayerEndReached, handleEvent, pUserData);
libvlc_event_attach(eventManager, libvlc_MediaPlayerPositionChanged, handleEvent, pUserData);

libvlc_video_set_format(mp, "RV24", 1280, 720, 1280* 3 );

/* play the media_player */
libvlc_media_player_play (mp);

 while(1)
 {
     if(videoBuffer)            // Check for invalid input
     {
         // CV_8UC3 = 8 bits, 3 chanels
         Mat img = Mat(Size(1280, 720), CV_8UC3, videoBuffer);
         // cvtColor(img, img, CV_RGB2BGR);
         namedWindow("Display window", WINDOW_AUTOSIZE);    // Create a window for display.
         imshow("Display window", img);     // Show our image inside it.
     }
 }
 libvlc_release (inst);
}
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
结构视频数据结构{
int参数;
};
int done=0;
libvlc_media_player_t*mp;
无符号int-videoBufferSize=0;
uint8_t*videoBuffer=0;
void cbVideoPrerender(void*p\u视频数据,uint8\u t**pp\u像素\u缓冲区,int大小){
//锁定
如果(大小>视频缓冲区大小| |!视频缓冲区)
{
printf(“重新分配原始视频缓冲区”);
免费(视频缓冲);
视频缓冲区=(uint8_t*)malloc(大小);
视频缓冲大小=大小;
}
*pp_像素_缓冲区=视频缓冲区;
}  
void cbVideoPostrender(void*p\u视频数据、uint8\u t*p\u像素缓冲区、int宽度、int高度、int像素间距、int大小、int 64点){
//解锁
//密柄(hMutex);
}
静态void handleEvent(常量libvlc_event_t*pEvt,void*pUserData){
libvlc___t time;
开关(pEvt->类型)
{
案例libvlc_mediaplayed:
时间=libvlc\u媒体\u播放器\u获取时间(mp);
printf(“MediaPlayerGed%lld ms\n”,(长)时间);
打破
case libvlc_MediaPlayerEnabledReached:
printf(“mediaplayerdreached\n”);
完成=1;
打破
违约:
printf(“%s\n”,libvlc事件类型名称(pEvt->type));
}
}
int main(int argc,char*argv[]){
//VLC指针
libvlc_实例_t*inst;
libvlc_media_t*m;
void*pUserData=0;
视频数据结构;
//VLC选项
char smem_选项[1000];
//RV24
sprintf(smem_选项
,“#转码{vcodec=RV24}:smem{”
“视频预渲染回调=%lld,”
“视频后期渲染回调=%lld,”
视频数据=%lld
“没有时间同步},”
,(长整型)(整型)(无效*)和cbVideoPrerender
,(长整型)(整型)(无效*)和cbVideoPostrender
,(长整型)(整型)(无效*)和数据结构
);
常量字符*常量vlc_参数[]={
“-I”、“dummy”//不要使用任何接口
“--忽略配置”,//不要使用VLC的配置
“--extrantf=logger”,//记录任何内容
--verbose=1“,//详细
“--sout”,smem\U选项//流到内存
};
//我们发射VLC
inst=libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]),vlc_args;
/*创建一个新项目*/
m=libvlc_media_new_location(inst,“5.mp4”);
/*创建媒体播放器播放环境*/
mp=libvlc_media_player_new_from_media(m);
libvlc\u事件管理器\u t*eventManager=libvlc\u媒体\u播放器\u事件管理器(mp);
libvlc_event_attach(事件管理器、libvlc_媒体播放器、handleEvent、pUserData);
libvlc_event_attach(eventManager,libvlc_mediaplayerdreached,handleEvent,pUserData);
libvlc_event_attach(事件管理器、libvlc_媒体播放器位置更改、handleEvent、pUserData);
libvlc视频集格式(mp,“RV24”、1280、720、1280*3);
/*播放媒体播放器*/
媒体播放器播放(mp);
而(1)
{
if(videoBuffer)//检查输入是否无效
{
//CV_8UC3=8位,3个通道
Mat img=Mat(大小(1280720),CV_8UC3,视频缓冲区);
//CVT颜色(img、img、CV_RGB2BGR);
namedWindow(“显示窗口”,窗口自动调整);//创建一个显示窗口。
imshow(“显示窗口”,img);//在其中显示我们的图像。
}
}
libvlc_发布(inst);
}
我想,这很容易解决,但我在互联网上找不到任何信息。我也试着把它放到“C:\5.mp4”中,但是我得到了同样的错误。谢谢你的帮助

编辑: 好的,我解决了这个问题,我需要在“5.mp4”之前加上文件://,现在我的视频正在播放,但看起来是这样的:

EDIT02
好的,有了“*.avi”,一切看起来都很好,所以我猜这个文件有问题-我用VLC从IP摄像头录制了它,并将它保存到了*.mp4

好的,所以我发现了问题,我在视频分辨率上犯了一个错误,原始分辨率是2560x1536,所以当我放入
libvlc\u video\u set\u格式(mp,256015362560*3)时我的图片看起来不错,所以在我将其传递给OpenCV后,我可以调整它的大小

您是否尝试过类似于cvtColor(img、img、CV_YUV2BGR_I420)的东西我试过了,结果差不多-很多行,但现在颜色不同了。你为什么评论这行
libvlc\u video\u set\u格式(mp,“RV24”,240,320,240*3)?您需要指定视频格式。你试过取消注释吗?对不起,这是我的错误,我忘了在这里取消注释,在我的工作区中它没有注释-没有结果。我很确定它与videoformat和每像素的位数有关。此外,使用
libvlc_视频_设置_格式(mp,“RV24”、240、320、240*3)
您指定了宽度为240像素、高度为320像素的垂直视频,因此将其更改为
libvlc_video_set_格式(mp,“RV24”、320、240、320*3)如果这是您的意图。