转自:http://tianxiaoma.blog.51cto.com/1501174/309519
一、动态改变参数:
查询得到对象,直接设置参数。
1、filter参数
查询得到对象,直接设置参数。
1、filter参数
libvlc_media_player_t *p_mediaplayer; // 输入播放器指针
vout_thread_t *p_vout = GetVout( p_mediaplayer, p_e );
if( p_vout )
{
filter_t *p_filter = filter_chain_GetFilter( p_vout->p->p_vf2_chain, 0, psz_filter_name );
if ( p_filter )
{
// .....
int i_ret = var_Set( p_filter, psz_param, val);
}
}
vout_thread_t *p_vout = GetVout( p_mediaplayer, p_e );
if( p_vout )
{
filter_t *p_filter = filter_chain_GetFilter( p_vout->p->p_vf2_chain, 0, psz_filter_name );
if ( p_filter )
{
// .....
int i_ret = var_Set( p_filter, psz_param, val);
}
}
2、subfilter参数
libvlc_media_player_t *p_mediaplayer; // 输入播放器指针
input_thread_t *p_input;
vlc_object_t *p_obj;
vlc_value_t val;
p_input = libvlc_get_input_thread( p_mi, p_e );
if( !p_input )
return;
p_obj = vlc_object_find_name( p_input, psz_filter_name, FIND_CHILD );
if( p_obj )
{
// .....
int i_ret = var_Set( p_obj , psz_param, val);
}
input_thread_t *p_input;
vlc_object_t *p_obj;
vlc_value_t val;
p_input = libvlc_get_input_thread( p_mi, p_e );
if( !p_input )
return;
p_obj = vlc_object_find_name( p_input, psz_filter_name, FIND_CHILD );
if( p_obj )
{
// .....
int i_ret = var_Set( p_obj , psz_param, val);
}
3、Media player参数
vout_thread_t *p_vout = GetVout( p_mi, p_e );
if(p_vout)
{
// .....
int i_ret = var_Set(p_vout , psz_param, val);
}
if(p_vout)
{
// .....
int i_ret = var_Set(p_vout , psz_param, val);
}
4、Instance参数(实例参数)
libvlc_instance_t *p_instance; // 输入实例指针
libvlc_int_t *p_libvlc = p_instance->p_libvlc_int;
if (p_libvlc)
{
// .....
int i_ret = var_Set(p_libvlc, psz_param, val);
}
libvlc_int_t *p_libvlc = p_instance->p_libvlc_int;
if (p_libvlc)
{
// .....
int i_ret = var_Set(p_libvlc, psz_param, val);
}
二、改变默认参数:
模块调用前(例如打开媒体前),静态设置。
(1) 可以通过VLC.exe的命令行传入默认参数;
模块调用前(例如打开媒体前),静态设置。
(1) 可以通过VLC.exe的命令行传入默认参数;
vlc.exe -vvv --extraintf=logger
(2) 也可以在调用libvlc_new函数创建实例时,传入默认参数;
const char* vlc_args[32] = {};
int vlc_args_num =0;
vlc_args[vlc_args_num++] = "-vvv"; // 日志输出的级别
vlc_args[vlc_args_num++] = "--extraintf=logger"; // 日志输出
/* init vlc modules, should be done only once */
m_pInstance = libvlc_new (vlc_args_num , vlc_args, &ex);
int vlc_args_num =0;
vlc_args[vlc_args_num++] = "-vvv"; // 日志输出的级别
vlc_args[vlc_args_num++] = "--extraintf=logger"; // 日志输出
/* init vlc modules, should be done only once */
m_pInstance = libvlc_new (vlc_args_num , vlc_args, &ex);
(3) 也可以在打开媒体前,传入默认参数;
szOption =
":deinterlace-mode=blend"; // Deinterlace滤镜参数:反交错参数
libvlc_media_add_option(m,szOption ,&ex);
/* Create a media player playing environement */
m_pMediaPlayer = libvlc_media_player_new_from_media (m, &ex);
libvlc_media_add_option(m,szOption ,&ex);
/* Create a media player playing environement */
m_pMediaPlayer = libvlc_media_player_new_from_media (m, &ex);
(4) 也可以运行时程序改变;
默认参数存储在模块树中。用程序改变默认参数,可使用下列函数:
#define config_GetType(a,b) __config_GetType(VLC_OBJECT(a),b)
#define config_GetInt(a,b) __config_GetInt(VLC_OBJECT(a),b)
#define config_PutInt(a,b,c) __config_PutInt(VLC_OBJECT(a),b,c)
#define config_GetFloat(a,b) __config_GetFloat(VLC_OBJECT(a),b)
#define config_PutFloat(a,b,c) __config_PutFloat(VLC_OBJECT(a),b,c)
#define config_GetPsz(a,b) __config_GetPsz(VLC_OBJECT(a),b)
#define config_PutPsz(a,b,c) __config_PutPsz(VLC_OBJECT(a),b,c)
#define config_GetInt(a,b) __config_GetInt(VLC_OBJECT(a),b)
#define config_PutInt(a,b,c) __config_PutInt(VLC_OBJECT(a),b,c)
#define config_GetFloat(a,b) __config_GetFloat(VLC_OBJECT(a),b)
#define config_PutFloat(a,b,c) __config_PutFloat(VLC_OBJECT(a),b,c)
#define config_GetPsz(a,b) __config_GetPsz(VLC_OBJECT(a),b)
#define config_PutPsz(a,b,c) __config_PutPsz(VLC_OBJECT(a),b,c)
程序示例:
libvlc_instance_t *p_instance; // 输入实例指针
vlc_value_t value; // 输入值
libvlc_int_t *p_libvlc = p_instance->p_libvlc_int;
if (p_libvlc)
{
// .....
config_PutInt(p_libvlc, psz_param, value.i_int);
}
vlc_value_t value; // 输入值
libvlc_int_t *p_libvlc = p_instance->p_libvlc_int;
if (p_libvlc)
{
// .....
config_PutInt(p_libvlc, psz_param, value.i_int);
}
三、说明
1、如果要动态改变参数,VLC模块中最好创建为“实例参数”(VLC Instance Param)。
例如:Demux模块中,创建"my-log-receive"模块参数:
1、如果要动态改变参数,VLC模块中最好创建为“实例参数”(VLC Instance Param)。
例如:Demux模块中,创建"my-log-receive"模块参数:
bool b_log_receive = var_CreateGetBool( p_demux->p_libvlc,
"my-log-receive");
2、模块中创建参数的流程如下:
(1) 对象是否已创建该参数?有则返回。
(2) 访问父对象或Instance对象,如果有则引用,并返回。
(3) 访问模块的默认参数,判断是否是模块参数?是则创建。
(1) 对象是否已创建该参数?有则返回。
(2) 访问父对象或Instance对象,如果有则引用,并返回。
(3) 访问模块的默认参数,判断是否是模块参数?是则创建。