Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1505422
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2009-10-14 09:38:28

万事开头难.还是从循环体开始吧
//按键事件
while( !brk_cmd && (cmd = mp_input_get_cmd(0,0,0)) != NULL) {
      brk_cmd = run_command(mpctx, cmd);
      mp_cmd_free(cmd);
      if (brk_cmd == 2)
      goto goto_enable_cache;
  }


main ->>run_command  --->>   set_property_command and set_osd_msg--->> mp_property_do 和参数索引-->m_property_do(mp_properties, name, action, val, ctx);-->>函数数组mp_properties-->mp_property_sub(设置成语言类型,也可以为外挂字幕的文件名)-->>update_subtitles,

其实走了弯路,我的目的不是字幕本身以及字幕的更新与显示,只是字幕的类型的识别与打印而已.
main ->>run_command  --->>   set_property_command --->> set_osd_msg
已结束
void set_osd_msg(int id, int level, int time, const char* fmt, ...);
只关心最后一个参数 ,通过信息
[mkv] Track ID 3: subtitles (S_TEXT/SSA) "英上中下", -sid 0, -slang und
[mkv] Track ID 4: subtitles (S_TEXT/SSA) "中上英下", -sid 1, -slang und
[mkv] Track ID 5: subtitles (S_TEXT/SSA) "英文字幕", -sid 2, -slang und
[mkv] Track ID 6: subtitles (S_TEXT/UTF8) "中文字幕", -sid 3, -slang und
来修改最后一个参数
set_prop_cmd[i].osd_msg即为要显示的字串格式, 有关系1个数组 set_prop_cmd[] , 命令ID是52
#define MP_CMD_SUB_SELECT 52
注意了是mp_property_print返回要打印的(0)unknown
do_action的倒数第个参数arg就是要显示的字幕种类的字符串,当然这个串也是有格式的,格式串由m_option_list_find根据name为sub到数组
mp_properties 中找到相应的选项, 我们找到m_option_t的对象为
// Subs
    { "sub", mp_property_sub, CONF_TYPE_INT,
     M_OPT_MIN, -1, 0, NULL },
然后执行里面的函数((m_property_ctrl_f)prop->p)(prop,action,arg,ctx);
也就是mp_property_sub(prop,action,arg,ctx);
里面主要看M_PROPERTY_PRINT的case ,
对mkv文件而言 ,下面三句表明了arg值的填充,当然首先是语言类型的获取
        char lang[40] = MSGTR_Unknown;
        demux_mkv_get_sub_lang(mpctx->demuxer, dvdsub_id, lang, 9);
        snprintf(*(char **) arg, 63, "(%d) %s", dvdsub_id, lang);

即然由demux_mkv_get_sub_lang来填充lang这一栏,那么mkv_track_t *track = demux_mkv_find_track_by_num (mkv_d, track_num, MATROSKA_TRACK_SUBTITLE) 就可以得到类似
[mkv] Track ID 3: subtitles (S_TEXT/SSA) "英上中下"
的东西了,因为结构体mkv_track_t已经包含了这些信息,我们只关心与字幕有关的字段:
typedef struct mkv_track
{
  int tnum;
  char *name;

  char *language;

  int type;
...
  float default_duration;

  int default_track;

  int subtitle_type;

  /* generic content encoding support */
  mkv_content_encoding_t *encodings;
  int num_encodings;

  /* For VobSubs and SSA/ASS */
  sh_sub_t *sh_sub;
} mkv_track_t;

关于外挂字幕:
通过m_config_parse_mp_command_line读取命令行上的文件名,再传给main函数
mpctx->playtree = m_config_parse_mp_command_line(mconfig, argc, argv);
filename = play_tree_iter_get_file(mpctx->playtree_iter,1);
//djkpengdan
关于内置字幕的根源Demux_mkv.c中
display_create_tracks可以得到所有track信息,当然也包括字幕track
最开始解析在matroska_read_header中
文件:sub0.2.tar.gz
大小:53KB
下载:下载

demux_mkv_find_track_by_language存在,但其它文件并无类似功能
阅读(925) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:STL算法集锦

给主人留下些什么吧!~~