2015-09-28 2 views
0

Я пытаюсь сделать что-то вроде этого поста: Get frame from video with libvlc smem and convert it to opencv Mat. (c++)работы с VLC SMEM

Я не могу вполне понять код в этой части:

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 //This would normally be useful data, 100 is just test data 
     , (long long int)200 //Test data 
    ); 

Это говорит video-data=%lld. Что это значит? Откуда беру данные?

Я получаю файл с помощью диалогового окна файла. Могу ли я передать этот файл на видеоданные?

+0

чек из [человек 3 Sprintf] (Http: //linux.die. net/man/3/sprintf) –

ответ

3

, а не использовать smem выходной драйвер VLC, я хотел бы предложить, чтобы взаимодействовать непосредственно с libvlc через интерфейс mediaplayer:

/* user_data is the pointer we passed to `video_set_callbacks()` */ 
void*lock_frame(void*user_data, void**planes) { 
    /* make '*plane* point to a memory you want the video-data rendered to */ 
    *planes=user_data->img; 
    return user_data->pic; 
} 
void unlock_frame(void *user_data, void *picture, void *const *planes) { 
    /* image rendered into (*planes)==user_data->img; */ 
} 

unsigned format_callback(void**user_data_ptr; char*chroma, unsigned *width, unsigned *height, unsigned *pitches, unsigned *lines) { 
    mydata_t*user_data=(mydata_t*)(*user_data_ptr); 

    /* set the output format to RGBA */ 
    memcpy(chroma, "RV32", 4); /* 'RV32' is 'RGBA' 
    /* leave dimensions intact, but store them 
    * now's the time to resize user_data->img to hold that much memory 
    */ 
    user_data->width =*width; 
    user_data->height=*height; 
    *pitches=(*width)*4; /* 4 is the pixel size for RGBA */ 
    *lines=*height; 

    return 1; 
} 


vlc_inst=libvlc_new (0, 0); 
libvlc_media_t*media = libvlc_media_new_location (vlc_inst, location); 
libvlc_media_player_t*mplayer=libvlc_media_player_new_from_media(media); 
libvlc_video_set_callbacks(mplayer, 
         lock_frame, unlock_frame, 
         0, user_data); 
libvlc_video_set_format_callbacks(data->m_mediaplayer, format_callback,0); 

libvlc_media_player_play(mplayer); 

/* the media-player will call 
* - format_callback() with a format suggestion which you can adjust to your needs 
* - lock_frame()/unlock_frame() whenever a new frame has arrived. 
* once you are done, call: */ 

libvlc_media_player_stop(mplayer); 
libvlc_release(vlc_inst); 
+0

tnx для ответа. извините, но я не очень C++ пользователь, поэтому у меня есть простые (я думаю) вопросы: D. что такое user_data? вы имеете в виду * planes = user_data-> img; вместо * plane = user_data-> img; ? Какое возвращение делает, не ваша функция недействительна? можете ли вы предоставить мне более полный код, пожалуйста. – user2798392

+0

'user_data' - это просто указатель на любые * ваши * данные; да, он должен был читать '' planes'; no, функция возвращает 'void *' (указатель на неуказанный тип); нет, я [не могу] (https://github.com/umlaeute/Gem/tree/master/plugins/videoVLC) –

+0

Этот метод работает только в том случае, если вы используете ** gem plugin **. u должен использовать ** pixBlock **. Я не думаю, что это необходимо, потому что libvlc может это сделать. u может сохранять видео в последовательности изображений. u может сделать снимок. поэтому вы можете извлечь изображение из видео в libvlc, но я не знаю, как это сделать. – user2798392

Смежные вопросы