1、为什么我的mplayer看不了rmvb(wmv……)的流媒体格式文件?
首先,你应该检查是不是没有codecs,只有你可以在本机上观看这种文件,才有进一步讨论的价值。
2、不是只要加上个firefox插件mediaXXX(¥%……%¥)就可以了嘛?哪有这么复杂?
其实这些所谓的插件,只能将程序关联到特定的文件类型,例如是一个php文件,如果有了插件,它可能就会读取php文件中的内容,将参数(通常就是个媒体文件地址)传给对应的播放器,但如果是播放器本身的问题,再怎么样的插件也是没有意义的。
3 为什么给mplayer打补丁?
mplayer本身其实对流媒体的支持挺好的,mms,rtsp,都可以播放(ubuntu中的编译参数确定了这一点)。大多数人的烦恼其实都是中文url无法解析而已。对于这个问题,只能通过对源码打补丁的方法解决,没有其他办法。这个补丁其实早已提交给mplayer官方,开始是说可能的内存泄露,后来几经修改后(我们这的是初版,不是修改后的),又认为没有一个合适的地方放置这种helper性质的代码~因为一般这种是在ffmpeg工程中的一个库决定的~可能会在以后,在mplayer的src下添加一个libmputils的目录吧,来处理这种编码转换之类的事。补丁不是我的,是ustc的前辈大侠FengguangWu的成果(最后一次看到在mplayer dev list上的讨论是他提出的)。
(有提醒的了~补充~关于string_utf16的补丁是ustc的WangWenrui大侠的功劳~(后来有个滚回~因为涉及的代码太多,关于setlocale的都要改,可能没有在官方包中了吧)
再补充,最早的版本(改动少点)是roger前辈的事~还是@ustc~)
唉,查看mailinglist挺麻烦的~~不过这么多人,是不是说明ustcers对在线影视比较重视?还是说科大影视的质量很好~~嘿嘿~其实是偶们比较fb~~
补丁1:对mms流中文的支持
代码: 全选
diff -Nur mplayer-1.0~rc1.orig/configure mplayer-1.0~rc1/configure
--- mplayer-1.0~rc1.orig/configure 2006-06-18 22:12:35.000000000 +0800
+++ mplayer-1.0~rc1/configure 2006-06-18 23:20:50.000000000 +0800
@@ -1585,6 +1585,7 @@
_dxr2=auto
_dxr3=auto
_iconv=auto
+_setlocale=auto
_langinfo=auto
_rtc=auto
_ossaudio=auto
@@ -1773,6 +1774,8 @@
--disable-dxr3) _dxr3=no ;;
--enable-iconv) _iconv=yes ;;
--disable-iconv) _iconv=no ;;
+ --enable-setlocale) _setlocale=yes ;;
+ --disable-setlocale) _setlocale=no ;;
--enable-langinfo) _langinfo=yes ;;
--disable-langinfo) _langinfo=no ;;
--enable-rtc) _rtc=yes ;;
@@ -2469,6 +2472,23 @@
fi
+echocheck "setlocale"
+if test "$_setlocale" = auto ; then
+ cat > $TMPC <<EOF
+#include <locale.h>
+int main(void) { setlocale(LC_ALL, ""); return 0; }
+EOF
+ _setlocale=no
+ cc_check && _setlocale=yes
+fi
+if test "$_setlocale" = yes ; then
+ _def_setlocale='#define USE_SETLOCALE 1'
+else
+ _def_setlocale='#undef USE_SETLOCALE'
+fi
+echores "$_setlocale"
+
+
echocheck "langinfo"
if test "$_langinfo" = auto ; then
cat > $TMPC <<EOF
@@ -7725,6 +7745,9 @@
/* define this to use iconv(3) function to codepage conversions */
$_def_iconv
+/* define this to use setlocale function */
+$_def_setlocale
+
/* define this to use nl_langinfo function */
$_def_langinfo
diff -Nur mplayer-1.0~rc1.orig/stream/asf_mmst_streaming.c
mplayer-1.0~rc1/stream/asf_mmst_streaming.c
--- mplayer-1.0~rc1.orig/stream/asf_mmst_streaming.c 2006-06-18
22:12:35.000000000 +0800
+++ mplayer-1.0~rc1/stream/asf_mmst_streaming.c 2006-06-18
23:19:15.000000000 +0800
@@ -25,12 +25,11 @@
#include <winsock2.h>
#endif
-#ifndef USE_SETLOCALE
-#undef USE_ICONV
-#endif
-
#ifdef USE_ICONV
#include <iconv.h>
+#ifdef USE_SETLOCALE
+#include <locale.h>
+#endif
#ifdef USE_LANGINFO
#include <langinfo.h>
#endif
@@ -552,8 +551,11 @@
/* prepare for the url encoding conversion */
#ifdef USE_ICONV
+#ifdef USE_SETLOCALE
+ setlocale(LC_ALL, "" );
+#endif
#ifdef USE_LANGINFO
- url_conv = iconv_open("UTF-16LE",nl_langinfo(CODESET));
+ url_conv = iconv_open("UTF-16LE", nl_langinfo(CODESET));
#else
url_conv = iconv_open("UTF-16LE", NULL);
#endif
4、具体步骤:
本人比较婆妈,喜欢讲原理,主要原因不是诲人不倦(还没有这个资格),只是由于每个人的具体情况都很有可能不同,讲清了原理,那么自己静悄悄的修正一下步骤就好,谢绝“too simple,sometimes 囗囗囗囗囗”的提问。
首先:
代码: 全选
apt-get source mplayer
sudo apt-get build-dep mplayer
sudo apt-get install liblivemedia-dev
第二步将control文件中的build dependency的包全部装上,这是为下一步编译做准备,提前将编译条件准备好。
第三步嘛,是让mplayer支持rtsp的外部库,也就是所谓的live555.com上的包(以前叫live.com,但是微软最后霸了这个域名,所以就改名了),这个包对版权好像有点问题,所以是没有shared object的库的,只有dev的静态库。不过有一种说法,是这个库在1.0~rc1中已经不在需要了,好像mplayer已经native支持了rtsp,不过我的教程不全是给最新版的人用的,特此说明一下,而且我没有验证这种说法的真实性(没有去看release note和changelog)。
在你执行这一步的工作目录下,会有一个mplayer-1.0~rc1的目录,这就是mplayer的源代码目录了。
将前面的补丁1随便用什么编辑器,在你的工作目录下保存为a.patch;
在工作目录下执行
代码: 全选
patch -p0 < a.patch
然后:
代码: 全选
cd mplayer-1.0~rc1/
dpkg-buildpackage -rfakeroot
编译结束后,在你的工作目录下会有几个mplayer的包,
代码: 全选
dpkg -i xxx.deb
为什么呢?不是已经可以支持中文了吗?呵呵,谁告诉你中文只有一种UTF8阿?这个补丁1是将C程序设定了setlocale的功能,我们一般都是zh_CN.UTF-8,但是很多网站可不是utf8的locale,他们采用gbk的编码,那传上去的地址还是错误的阿!
不要紧,做个简单的wrapper就可以了。
随便什么编辑器编辑~/.bashrc
在最后添加
代码: 全选
export PATH=$PATH:~/bin
在~/bin/目录下编辑ustcmms文件
代码: 全选
#! /bin/sh
mplayer `cat $1|iconv -f gbk -t utf8`
代码: 全选
chmod a+x ustcmms
这一行说明的是,将目标文件显示出来,然后从gbk转码为utf8,接着将这个正确的地址交给mplayer来播放。
我看的是科大影视:video.ustc.edu.cn,在点击一个连接后,会下载一个play.php,选择打开方式,用我们的ustcmms来打开,OK,正常播放了!
有心人会注意到,为什么这个wrapper只是叫做ustcmms呢?rtsp怎么办?呵呵,前辈的补丁只是对mms进行了处理,rtsp并没有改动,所以在播放rtsp的时候,中文的url还是有问题。那怎么办呢?提示一下:还是wrapper哦!
mplayer可以接受两种输入,一种是所谓的直接的文件名,例如:
代码: 全选
mplayer rtsp://xxx.edu.cn/片片.rm
代码: 全选
mplayer rtsp%3A//xxx.edu.cn/%E7%89%87%E7%89%87.rm
代码: 全选
#! /usr/bin/env python
def main(argv):
if len(argv)!=2:
print 'Please use 1 option'
return 0
else:
content=argv[1]
content=re.sub(r'\n$','',content)
gbkURL=urllib.quote(content)
gbkURL=re.sub(r'^rtsp%3A','rtsp:',gbkURL)
print gbkURL
if __name__=="__main__":
try: import urllib,re,sys
except ImportError:
print 'Please Check that you have sys,os,re,urllib modules'
main(sys.argv)
代码: 全选
#! /bin/sh
SOU=`cat $1`
DES=`URL $SOU`
mplayer $DES
#realplay $DES
#注意,有些文件名仍然会错误,这是string_utf16函数的问题,此补丁暂时没有加入,等再研究研究代码。
#不过可以用realplay来放,只要传给realplay的是URL地址就可以了。
祝大家都能在linux下享受在线流媒体~
还有,apt系统升级的时候,老是把我自己打包的软件给更新了,真麻烦,怎么办?呵呵,很简单:
编辑/etc/apt/preferences
添加如下内容:
代码: 全选
Package: mplayer
Pin: version 1.0~rc1ubuntu10
Pin-Priority: 1001
修正补丁二我重新看了源码,有问题,返回的是void,移除。
Wang Wenrui@ustc for string_utf16
roger@ustc for original patch
video@ustc 的rtsp是用的gbk编码返回~修改脚本
修正笔误。