Open mp4 with libVLC and play it in OpenCV C++

匿名 (未验证) 提交于 2019-12-03 01:25:01

问题:

I want to play video file, that i obtained from IP-camera (H264-codec) using libVLC and OpenCV, so i took the code from this post, then created project in VS 2010, and put my mp4 file into project folder ("5.mp4"). When i started it - i got this errors:

main error: open of `5.mp4' failed

main error: Your input can't be opened

main error: VLC is unable to open the MRL '5.mp4'. Check the log for details.

Here's my code:

#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); } 

I guess, that is easy to fix, but i could't find any information at the Internet. I also tryied to put it into "C:\5.mp4", but i got the same errors. Thanks for any help.

EDIT: Ok, so i fixed this issue, i need to put file:/// before "5.mp4", now my video is playing, but it looks like this:

EDIT02 Ok, with "*.avi" everything looks good, so i guess problem with this file - i recorded it frop IP-camera, using VLC, and saved it into *.mp4

回答1:

Ok, so i found the problem, i made a mistake with video resolution, original resolution is 2560x1536, so when i put libvlc_video_set_format(mp,2560,1536,2560 *3); my picture looks fine, so after i pass it to OpenCV i could resize it.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!