2007年6月14日星期四

用strace定位totem不能播放rmvb的问题

俺在新装的ubuntu上装了totem, 并且是totem-xine,当然缺省是不能播放rmvb的,得自己来折腾了。

其实开始装的是totem-gstreamer, 试验totme能否播放rmvb的时候totem会问是否要自动搜索解码器,选了是,它就给我搞了个安装gstreamer-ffmpeg,结果也如所料:放不了rmvb。

先是试着将debian上/usr/lib/win32目录进行符号链接过来(ln -s /mnt/debian/usr/lib/win32 /usr/lib/win32),还是不行。

再按一些网上帖子说的,到mplayer网站下载rp9codecs-200?????.tar.bz2,解压动态库到~/.gnome2/totem-addons,仍旧不行。又试验了w32codecs,不行。

再就直接去找realplayer了,http://www.real.com/linux 默认的那个已经很旧了,有很多依赖库都不好解决,点那个nightly build应该可以下载到最新的版本。不过我是找了个edgy的非官方包装在feisty上(从包索引可以看出, 那上面还没有feisty版本的realplayer,也许你看的时候已经有了)。
不过这个东西装上之后一运行realplay就segfault了,这很多帖子说过,是跟scim冲突的问题,修改/usr/bin/realplay,在里面添加一行"export GTK_IM_MODULE="就可以了。
然后很可能播放时画面或者声音会有些卡,装个alsa-oss可以解决: 仍旧修改/usr/bin/realplay,在它执行realplay.bin那行(目前是第73行)加上一个aoss就可以了。
综合前面两条,/usr/bin/realplay最后几行是这样
REALPLAYBIN=$HELIX_LIBS/realplay.bin
if [ -n "$DEBUG" -a -x "$CATCHSEGV" ]; then
$CATCHSEGV $REALPLAYBIN ${1+"$@"}
else
while /bin/true; do
export GTK_IM_MODULE=
export XMODIFIERS=
aoss $REALPLAYBIN "$@"
# Restart the player if exit code is 10
if [ $? -ne 10 ]; then
break
fi
done
fi
现在可以在realplayer里播放rmvb了,回到totem,还是不行(也许有朋友要问,为啥非得用totem不用realplayer放啊,这是因为totem有gnome-vfs支持,可以从网络共享上直接播放,:-)。我用strings /usr/bin/totem-xine | grep addons查过了,结果为空,所以觉得很多网友虽然说将codecs库放到~/.gnome2/totem-addons那样可以,但现在也许已经改掉了(刚下载了totem源代码,还没有来证实)。

于是祭出strace,顺便打开totem的debug开关:

strace totem --debug > trace.out 2>&1

在totem中打开一个rmvb文件,它报告不能播放该格式文件,关闭退出totem.
然后用vi打开trace.out,查找open或者fstat/fstat64调用,或者codec字样,然后我看到如下内容:
stat64("/usr/local/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/opt/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/RealPlayer9/users/Real/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/RealPlayer10/codecs/drvc.so", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib64/RealPlayer8/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib64/RealPlayer9/users/Real/Codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib64/RealPlayer10/codecs/drvc.so", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/codecs/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/win32/drv3.so.6.0", 0xbfe23b2c) = -1 ENOENT (No such file or directory)
这里可以看到它搜索了/usr/lib/RealPlayer10目录,但realplayer目前的安装目录是/usr/lib/realplayer-10.0.8,于是创建一个符号连接解决问题。

总结一下: 从上面的strace输出可以看出,将drv3.so.6.0放到/usr/lib/win32或者/usr/lib/codecs应该也是可以的,我卸载realplay后重新用rp9codecs或者w32codecs试验,也的确可以,不知道原来哪里有问题 :-(
奇怪的是,它在/usr/lib/RealPlayer10目录搜索的是drvc.so,在其他目录搜的却是drv3.so.6.0.

P.S 请卸载libxine1-ffmpeg库,否则你用totem播放rmvb时,它会用ffmpeg里面提供的音频解码器(在"属性"中可以看到其编解码器名称),造成没有声音。

又: 刚才发现一个地方有realplay/w32codecs的包,写的是feisty版本,不知道是不是。不过偶尔找个老版本装也没有什么问题,尤其这几个对其他包依赖不太强的。

2 条评论:

巴蛮子 说...

补充一下: 请卸载libxine1-ffmpeg库,否则你用totem播放rmvb时,它会用ffmpeg里面提供的音频解码器(在"属性"中可以看到其编解码器名称),造成没有声音。

匿名 说...

如果是安装totem-xine的话就非常方便了。
apt-get install w32codecs totem-xine 就ok了。

http://www.cppblog.com/whycrying/archive/2007/05/28/25017.html