最近在准备看深度学习的算法,翻起两年前的博客,发现有不少的留言和私信在问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重新做了完整的播放、录制等接口。大家有兴趣可以探讨沟通。
好了,你们继续聊,我去研究深度学习算法了,哈