最近在準備看深度學習的算法,翻起兩年前的部落格,發現有不少的留言和私信在問LibVLC的交叉編譯、增加錄制函數相關的問題,上次的部落格是把方法思路說了,既然大家問代碼,那就把具體源碼分享一下吧。
在LibVLC中增加錄制的接口,需要修改3個檔案:
1、在include\vlc\libvlc_media_player.h檔案中聲明為LIBVLC_API類型的接口函數。找到libvlc_media_player_stop,在後面加兩行。
/**
* Stop (no effect if there is no media)
*
* \param p_mi the Media Player
*/
LIBVLC_API void libvlc_media_player_stop ( libvlc_media_player_t *p_mi );
/add by AVSuper/
LIBVLC_API int libvlc_media_player_recorder_start ( libvlc_media_player_t *p_mi, const char *pFileName );
LIBVLC_API int libvlc_media_player_recorder_stop ( libvlc_media_player_t *p_mi);
///
2、還需要将接口在lib/libvlc.sym 檔案中添加,否則make編譯時會在連接配接進動态庫時變為靜态,不可被外部調用。一樣的,找到libvlc_media_player_stop在後面加兩行。
libvlc_media_player_stop
libvlc_media_player_recorder_start
libvlc_media_player_recorder_stop
3、接下來,在lib\media_player.c增加實際的代碼,看好了,就是這段(其實也就幾行代碼)。
int libvlc_media_player_recorder_start( libvlc_media_player_t *p_mi, const char *pFileName )
{
input_thread_t *p_input = libvlc_get_input_thread( p_mi );
if(p_input == NULL) return -1;
var_CreateGetString(p_input, "input-record-path");
var_SetString( p_input, "input-record-path", pFileName );
/* var_CreateGetString(p_input, "sout-record-dst-prefix");
var_SetString( p_input, "sout-record-dst-prefix", pFileName );
*/
var_SetBool( p_input, "record", true);
vlc_object_release(p_input);
return 0;
}
int libvlc_media_player_recorder_stop( libvlc_media_player_t *p_mi )
{
input_thread_t *p_input_thread;
p_input_thread = libvlc_get_input_thread( p_mi );
if( !p_input_thread ) return -1;
var_SetBool( p_input_thread, "record", false );
vlc_object_release( p_input_thread );
return 0;
}
嗯,然後編譯吧。。。
VLC的功能還是很強大的,接口封裝得也很好,不過有幾個問題是它一直沒解決的,比如libvlc _media_player_stop調用的死鎖問題,到現在這麼多版本了都沒解決。是以近期就沒再繼續研究vlc了,用ffmpeg重新做了完整的播放、錄制等接口。大家有興趣可以探讨溝通。
好了,你們繼續聊,我去研究深度學習算法了,哈