[原创]流媒体解决方案:mplayer解决mms和rtsp播放
发表于 : 2007-06-07 18:18
很久没有来坛子里了,也没象以前那样给大家时不时的写点东西。看到有的弟兄还是有些流媒体方面的问题,google也没有很好的结果,我在这里稍微总结一下我自己的小小体会:
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流中文的支持
4、具体步骤:
本人比较婆妈,喜欢讲原理,主要原因不是诲人不倦(还没有这个资格),只是由于每个人的具体情况都很有可能不同,讲清了原理,那么自己静悄悄的修正一下步骤就好,谢绝“too simple,sometimes 囗囗囗囗囗”的提问。
首先:
解释一下,第一步从ubuntu的源中将mplayer的源代码get下来,注意,不需要,也不推荐使用sudo的根用户权限。
第二步将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;
在工作目录下执行
这两步会把你的补丁打入源代码包。要注意的是,补丁与版本号是相关的,不同版本的补丁打不进去的。例如说,在mplayer的1.0pre5中,asf_mmst_streaming.c源文件在mplayer-$version/libmpdemux目录下,但是在rc1中,却在mplayer-$version/stream目录下,乱打肯定是找不到文件的。遇到这种情况,自己手动修改一下patch文件就好了~什么?不知道怎么改?替换路径就是了么~
然后:
此时,就泡杯coffie好好休息一下,或者出去运动半小时~反正就是等待编译结束就可以了。
编译结束后,在你的工作目录下会有几个mplayer的包,
呵呵~不过别急,事情还没完,为了方便我们的点播,还有些要做的!
为什么呢?不是已经可以支持中文了吗?呵呵,谁告诉你中文只有一种UTF8阿?这个补丁1是将C程序设定了setlocale的功能,我们一般都是zh_CN.UTF-8,但是很多网站可不是utf8的locale,他们采用gbk的编码,那传上去的地址还是错误的阿!
不要紧,做个简单的wrapper就可以了。
随便什么编辑器编辑~/.bashrc
在最后添加
以后,新启动的终端,就会将你的主目录下的bin目录做为PATH的一个部分了,也就是说,这个目录下的命令文件随便在什么目录下都是可见的。
在~/bin/目录下编辑ustcmms文件
记得加上可执行权限:
稍微解释一下,第一行说明这是一个sh脚本。第二行的$1代表传入的第一个参数(不包括命令名本身),iconv是对文本进行转码的工具,而“`”符号框住的内容代表这里面命令执行后的结果。
这一行说明的是,将目标文件显示出来,然后从gbk转码为utf8,接着将这个正确的地址交给mplayer来播放。
我看的是科大影视:video.ustc.edu.cn,在点击一个连接后,会下载一个play.php,选择打开方式,用我们的ustcmms来打开,OK,正常播放了!
有心人会注意到,为什么这个wrapper只是叫做ustcmms呢?rtsp怎么办?呵呵,前辈的补丁只是对mms进行了处理,rtsp并没有改动,所以在播放rtsp的时候,中文的url还是有问题。那怎么办呢?提示一下:还是wrapper哦!
mplayer可以接受两种输入,一种是所谓的直接的文件名,例如:
但还有一种URL格式,也就是在网站的地址上常看到的:
我手写了个很简单的将文件名转为URL编码的py脚本:
同样的,将它命名为bin/URL,加上可执行权限,这样,我们的ustcrtsp脚本就变为
呵呵,这下没有问题了吧?这上面的wrapper都是对ustc的video的适应,如果你有类似的其他环境,对照着改就好了~
祝大家都能在linux下享受在线流媒体~
还有,apt系统升级的时候,老是把我自己打包的软件给更新了,真麻烦,怎么办?呵呵,很简单:
编辑/etc/apt/preferences
添加如下内容:
即可。以后mplayer就不会升级了。因为给它的权重已经大于1000了~
修正补丁二我重新看了源码,有问题,返回的是void,移除。
Wang Wenrui@ustc for string_utf16
roger@ustc for original patch
video@ustc 的rtsp是用的gbk编码返回~修改脚本
修正笔误。
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编码返回~修改脚本
修正笔误。