2014-12-16 3 views
2

Я использую libvlc для извлечения необработанного фрейма с любого носителя (rtsp, mjpeg, mp4, avi ...) с помощью smem-обратных вызовов, и все отлично работает.libvlc_media_player_stop 30secondes to return

Но моя проблема в том, что когда я вызываю libvlc_media_player_stop или libvlc_media_player_release, он просто замораживает мою программу в течение 30 секунд.

Я делаю много поиска и попробовать многие обходные пути:

Сделать новую нить, чтобы вызвать остановку: не решить мою проблему, потому что, если я хочу играть заново СМИ, медиаплеер до сих пор висит в основной поток.

Вызов остановки из основного потока не на событие мыши: застрял 30 секунд.

Я пробую разную версию от 2.1.3 до последней версии git 3.0.0, и проблема остается прежней, так как вы называете эту остановку?

Инициализация:

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

const char * const vlc_args[] = { 
"-I", "dummy",  
"--verbose=0", 
"--clock-jitter=0", 
"--no-audio", 
"--sout", smem_options // Stream to memory 
}; 
mpLibVlc = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args); 

Начало:

mpMedia = libvlc_media_new_path(mpLibVlc, mMediaPath.c_str()); 
mpMediaPlayer = libvlc_media_player_new_from_media(mpMedia); 
libvlc_media_player_play(mpMediaPlayer); 

Stop:

libvlc_media_player_set_hwnd(mpMediaPlayer, NULL); 
libvlc_media_release(mpMedia); 
libvlc_media_player_stop(mpMediaPlayer); 
libvlc_media_player_release(mpMediaPlayer); 

Я нашел много другой проблемы с VLC, но это единственная библиотека которым ручка easyly все тезисы.

Итак, как я могу назвать эту остановку без зависания?

спасибо.

+0

Вы пробовали 'libvlc_media_player_stop' перед' libvlc_media_release'? – i486

+0

Да, я пробовал только libvlc_media_player_stop и libvlc_media_player_release, но без остановки тоже, и это всегда занимало 30 секунд. – Maypeur

+0

Я столкнулся с той же проблемой. Вы решили? – Temak

ответ

0

@ serg.v.gusev мой пост старый, но то, что я помню, это: Вы должны соблюдать: - Используйте libvlc_media_player_new_from_media для загрузки локальных файлов. - Используйте libvlc_media_player_new_from_location для подключения к IP-камере.

Во всяком случае, в моем случае мое оригинальное видео было сломанным, и это то, что было навешивать вызов, чтобы остановить во время тезисов 30 секунд, тот же код работает с хорошо закодированными видеофайлами.

PS: Я переехал в ffmpeg для чтения и записи видеоматериалов. Это немного сложнее, но поскольку vlc основан на ffmpeg, у вас больше контроля, возможности и обновления ...

+0

Я не могу найти функцию libvlc_media_player_new_from_location, возможно, она устарела и удалена (я работаю с версией 3.0.0 git). Но я уже использую libvlc_media_new_location для создания экземпляра libvlc_media. Я думаю, что это то же самое. Мой видеопоток определенно правильный, поэтому этот способ кажется мне неэффективным, особенно учитывая, что мой процесс заблокирован навсегда, а не только на 30 секунд. Спасибо за ваш ответ! –