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