jarodpardon 发表于 2006-9-22 10:09:39

MPlayer中文SRT字幕显示下划线的解决方案

Linux下MPlayer的中文字幕支持

   MPlayer是个优秀的视频播放软件,大多数Linux用户都会用它来看各种类型格式的视频。本文将介绍如何使MPlayer正确地显示中文字幕。我从早期使用MPlayer-0.5到现在最新的MPlayer-0.8一直使用了近五年的时间。

-、获取MPlayer
    这个不用多说,你可以从官方网站(www.mplayerhq.hu)下载源码包自行编译,或者直接安装别人编译打包好的安装包。具体方法可以参看论坛上很多相关文章。我用的是Debian系统,虽然MPlayer没有进入Debian的官方Source中,但是一个叫Marillat的人近年来一直在负责维护MPlayer的Debian包,你可以从www.debian-multimedia.org上找到合适的镜像获取已经编译好的deb包。当然了,也有人制作相应的rpm包了。

二、中文字体和中文字幕
    你通过浏览论坛的帖子或者使用google大法所获得的使MPlayer显示中文字幕的方法几乎都是这样写的——当然这也是最简单的方法——几乎对于所有非root用户具有普遍性:
    把一个中文TrueType字体例如simhei.ttf弄到在$HOME/.mplayer/下并更名为subfont.ttf,这里你可以使用copy方法( cp /usr/local/share/fonts/simhei.ttf ~/.mplayer/subfont.ttf )或者符号链接的方法( ln -s /usr/local/share/fonts/simhei.ttf ~/.mplayer/subfont.ttf ),然后你可以通过gmplayer(MPlayer GUI)的图形化配置对话框更改"Subtitles&OSD->Encoding"为"cp936"并勾上"Unicode subtitle"以及"Font->Encoding"为"unicode",也可以手工编辑它的配置文件(注意:gmplayer的配置文件是$HOME/.mplayer/gui.conf而mplayer的配置文件是$HOME/.mplayer/config)。
    如果不幸地是你的MPlayer没有编译对FreeType字体支持,那么你就无法使用subfont.ttf,你就只能从官方网站下载字体文件(例如gb2312-kai.tgz),实际上它是一个压缩包包含了一系列文件,其中一个font.desc就是字体描述文件,可以通过命令行参数或者配置文件来指定这个font.desc作为默认的OSD字体。
    我的MPlayer的配置文件是这么写的(相信大多数人和我的一样):
    % $HOME/.mplayer/config 设置 mplayer
    vo=gl2
    ao=alsa
    font="/usr/local/share/fonts/simhei.ttf" #指定subtitle的字体,如果没有指定或者找不到则使用默认的$HOME/.mplayer/subfont.ttf
    subcp=cp936                              #指定subtitle的默认编码为cp936(简体中文)
    zoom=yes
    subfont-autoscale=3
    subfont-text-scale=3
    sub-fuzziness=1

    % $HOME/.mplayer/gui.conf 设置 gmplayer (选项太多,多数为默认设置,只列出Font相关选项)
    sub_auto_load = "yes"
    sub_unicode = "yes"
    sub_cp = "cp936"
    font_name = "/usr/local/share/fonts/simhei.ttf"
    font_encoding = "unicode"

    基本上这样写可以使MPlayer正确地显示中文字幕,至少在MPlayer-1.0-pre7cvs20060103版本还是正确的,但是随着MPlayer的版本升级,问题出来了。
   
三、问题出来了
   我在昨天之前一直使用Marrilat编译的MPlayer-1.0-pre7cvs20060103版本,可以正常显示中文subviewer格式的字幕(*.srt),但是昨天升级到MPlayer-1.0-pre8-0.1版本后,中文subviewer字幕无法正常显示了,中文都显示成一堆下划线'____',但是vobsub格式字幕显示正常(*.sub),在网上有很多人遇到跟我一样的问题。vobsub字幕显示正常是必然的,因为它不依赖系统字体,它的字型是内嵌的,而subviewer字幕是纯文本格式的,依赖字体设定,中文显示乱码或者下划线则说明字体设定不正确。可是问题在于,我以前用pre7好好的,配置文件又没有变,那怎么升级到pre8了就用不了了?起先我怀疑是我下载的这个MPlayer包没有把FreeType编译好或者其他什么编译上的问题,于是我下载了MPlayer源码包自行编译,结果还是这样的问题,那么不是编译的问题了,还是配置的问题?我折腾了一晚上,无意间看了一下MPlayer的全局配置文件/etc/mplayer/mplayer.conf,我比较了MPlayer-1.0-pre7cvs20060103和MPlayer-1.0-pre8-0.1两个版本的/etc/mplayer/mplayer.conf,发现关于Font的设置有这样不同:
   % MPlayer-1.0-pre7cvs20060103/etc/mplayer/mplayer.conf %
   ## get a default OSD font from fontconfig
   # fontconfig = yes
   # font = "Sans"
   # subfont-text-scale = 3
   # subcp = iso-8859-15
   
   % MPlayer-1.0-pre8-0.1/etc/mplayer/mplayer.conf %
   # get a default OSD font from fontconfig
   fontconfig = yes
   font = "Sans"
   subfont-text-scale = 3

   在MPlayer-1.0-pre7cvs20060103中这几行是注释掉的,fontconfig默认是关闭的;而在MPlayer-1.0-pre8-0.1中fontconfig默认是开启的并设置了默认字体为"Sans"。后来证实就是这2行差异导致了中文字幕问题。
   那么什么是fontconfig?它是一种字体管理工具。在MPlayer的文档中关于Font有这样的说明(man mplayer):
   -font <path to font.desc file> (OSD only)
            SearchfortheOSD/SUBfontsinan alternative directory (default for normal fonts: ~/.mplayer/font/font.desc, default for FreeType
            fonts: ~/.mplayer/subfont.ttf).
            NOTE: With FreeType, this option determines the path to the text font file.With fontconfig, this option determines the fontconfigfont
            name.

            EXAMPLE:
               -font ~/.mplayer/arial-14/font.desc
               -font ~/.mplayer/arialuni.ttf
               -font 'Bitstream Vera Sans'

    -fontconfig (fontconfig only)
            Enables the usage of fontconfig managed fonts.

    这里提到了MPlayer支持的3种字体设定方式:
    a, 在使用fontconfig时,指定fontconfig的字体名
    b, 在不使用fontconfig时,指定Truetype字体文件路径
    c, 在不使用fontconfig时,指定常规字体文件font.desc路径
    如果指定的文件路径不存在,则使用默认字体路径。
    那么什么是fontconfig的字体名?它和字体文件名有什么区别?fontconfig的字体名是对这个字体的描述,它是内嵌在字体文件中的,不会改变的,而文件名却可以随意更改。例如宋体的英文字体名是SimSun,而文件名你可以是simsun.ttf也可以是subfont.ttf。你在KDE控制面板里面字体设置是看到的就是字体名SimSun,而不会看到它的路径,它可以放在/usr/share/fonts/simsun.ttf也可以在$HOME/.fonts/simsun.ttf。而且,只有当字体已经注册到系统字体库后,你才能用fontconfig字体名。
    说到这里大家应该可以想到原因了。字幕出问题的原因就是:
    在全局设置/etc/mplayer/mplayer.conf默认开启了fontconfig,但是又在$HOME/.mplayer/config中设置了font="/usr/local/share/fonts/simhei.ttf"这种非fontconfig的字体设定模式,按照字体设定优先顺序: 命令行-font > $HOME/.mplayer/config > /etc/mplayer/mplayer.conf > 默认值 ,$HOME/.mplayer/config中font设置取代了全局设置,这里矛盾出来了,你开启了fontconfig字型管理模式,却又指定了一个不正确的"字体名"("/usr/local/share/fonts/simhei.ttf"是字体路径,当然不是字体名),系统当然找不到这么一个字体,如果你把font="/usr/local/share/fonts/simhei.ttf"改成任意一个正确的字体名就一切OK了,比如font="SimHei" 。
   
四、解决方案总结
   首先是要编译MPlayer对FreeType2和Fontconfig的支持,大多数系统都有FreeType和Fontconfig的库文件和头文件,编译应该不是问题。
   其次是找到合适的中文字体并加入到fontconfig中,例如宋体simsun.ttf,可以参看网上的汉化攻略。
   最后做正确的配置。对于非root用户,无法修改全局配置文件/etc/mplayer/mplayer.conf,那么就用用户配置文件$HOME/.mplayer/config或gui.conf替换默认配置,并无论如何保证fontconfig的设定和font的设定一致,你的配置文件中至少应该有这样2行:
   
   ## 使用fontconfig
   fontconfig = yes
   font = "SimSun"
   
   或者
   ## 不使用fontconfig
   fontconfig = no
   font = "/usr/share/fonts/simsun.ttf"

   然后在加上:
   subcp=cp936
   zoom=yes
   unicode=yes
   subfont-encoding=unicode
   
   等等配置。

acguy 发表于 2006-10-23 12:01:50

谢谢!
不过如果在gui.conf中设fontconfig=no,启动gmplayer时会自动被删除。
在$HOME/.mplayer/config中设置较妥。

wenliangyu 发表于 2006-10-28 15:37:58

不知道Windows下MPUI出现这个问题该怎么办?我试了,直接用MPUI的mplayer播放也能显示中文,但是用了MPUI就不行。
页: [1]
查看完整版本: MPlayer中文SRT字幕显示下划线的解决方案