改变VLC模块参数

时间:2021-10-04 15:51:49

转自:http://tianxiaoma.blog.51cto.com/1501174/309519


一、动态改变参数:
    查询得到对象,直接设置参数。
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); 

        } 

 

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); 
        } 

 
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); 
        } 
 
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); 
        } 
 
二、改变默认参数:
模块调用前(例如打开媒体前),静态设置。
(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); 
 
(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);
 
(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) 

程序示例:
        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); 
        } 
 
三、说明
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) 访问模块的默认参数,判断是否是模块参数?是则创建。