免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1279 | 回复: 0
打印 上一主题 下一主题

mplayer subtitles 源码修改 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-14 09:38 |只看该作者 |倒序浏览
万事开头难.还是从循环体开始吧
//按键事件
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.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存在,但其它文件并无类似功能
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104733/showart_2069893.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP