[原创]流媒体解决方案:mplayer解决mms和rtsp播放

Totem,mplayer,sopcast,realplayer,bmp
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01

[原创]流媒体解决方案:mplayer解决mms和rtsp播放

#1

帖子 xiechy » 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流中文的支持

代码: 全选

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
解释一下,第一步从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;
在工作目录下执行

代码: 全选

patch -p0 < a.patch
这两步会把你的补丁打入源代码包。要注意的是,补丁与版本号是相关的,不同版本的补丁打不进去的。例如说,在mplayer的1.0pre5中,asf_mmst_streaming.c源文件在mplayer-$version/libmpdemux目录下,但是在rc1中,却在mplayer-$version/stream目录下,乱打肯定是找不到文件的。遇到这种情况,自己手动修改一下patch文件就好了~什么?不知道怎么改?替换路径就是了么~

然后:

代码: 全选

cd mplayer-1.0~rc1/
dpkg-buildpackage -rfakeroot
此时,就泡杯coffie好好休息一下,或者出去运动半小时~反正就是等待编译结束就可以了。
编译结束后,在你的工作目录下会有几个mplayer的包,

代码: 全选

dpkg -i xxx.deb
呵呵~不过别急,事情还没完,为了方便我们的点播,还有些要做的!

为什么呢?不是已经可以支持中文了吗?呵呵,谁告诉你中文只有一种UTF8阿?这个补丁1是将C程序设定了setlocale的功能,我们一般都是zh_CN.UTF-8,但是很多网站可不是utf8的locale,他们采用gbk的编码,那传上去的地址还是错误的阿!

不要紧,做个简单的wrapper就可以了。
随便什么编辑器编辑~/.bashrc
在最后添加

代码: 全选

export PATH=$PATH:~/bin
以后,新启动的终端,就会将你的主目录下的bin目录做为PATH的一个部分了,也就是说,这个目录下的命令文件随便在什么目录下都是可见的。
在~/bin/目录下编辑ustcmms文件

代码: 全选

#! /bin/sh
mplayer `cat $1|iconv -f gbk -t utf8`
记得加上可执行权限:

代码: 全选

chmod a+x ustcmms
稍微解释一下,第一行说明这是一个sh脚本。第二行的$1代表传入的第一个参数(不包括命令名本身),iconv是对文本进行转码的工具,而“`”符号框住的内容代表这里面命令执行后的结果。
这一行说明的是,将目标文件显示出来,然后从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
但还有一种URL格式,也就是在网站的地址上常看到的:

代码: 全选

mplayer rtsp%3A//xxx.edu.cn/%E7%89%87%E7%89%87.rm
我手写了个很简单的将文件名转为URL编码的py脚本:

代码: 全选

#! /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/URL,加上可执行权限,这样,我们的ustcrtsp脚本就变为

代码: 全选

#! /bin/sh
SOU=`cat $1`
DES=`URL $SOU`
mplayer $DES
#realplay $DES 
#注意,有些文件名仍然会错误,这是string_utf16函数的问题,此补丁暂时没有加入,等再研究研究代码。
#不过可以用realplay来放,只要传给realplay的是URL地址就可以了。
呵呵,这下没有问题了吧?这上面的wrapper都是对ustc的video的适应,如果你有类似的其他环境,对照着改就好了~
祝大家都能在linux下享受在线流媒体~

还有,apt系统升级的时候,老是把我自己打包的软件给更新了,真麻烦,怎么办?呵呵,很简单:
编辑/etc/apt/preferences
添加如下内容:

代码: 全选

Package: mplayer
Pin: version 1.0~rc1ubuntu10
Pin-Priority: 1001
即可。以后mplayer就不会升级了。因为给它的权重已经大于1000了~

修正补丁二我重新看了源码,有问题,返回的是void,移除。
Wang Wenrui@ustc for string_utf16
roger@ustc for original patch
video@ustc 的rtsp是用的gbk编码返回~修改脚本
修正笔误。
上次由 xiechy 在 2007-06-07 21:04,总共编辑 6 次。
头像
zhan
帖子: 1880
注册时间: 2005-08-15 0:04
来自: 南7技校

#2

帖子 zhan » 2007-06-07 18:30

sigh 有事没有去参加 LUG 的大会,看来是很大的损失啊......
飞得高,飞得低,学习再学习,多少大秘密!
http://zhan.blog.ubuntu.org.cn
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01

#3

帖子 xiechy » 2007-06-07 19:16

小声说~其实偶也没去~不过既然讲pxe肯定的HappyWu出马的~
头像
rhfcaesar
帖子: 2996
注册时间: 2005-11-17 15:45
来自: 湖北

#4

帖子 rhfcaesar » 2007-06-07 20:22

谢谢楼主,非常棒,非常棒。
xblx
帖子: 274
注册时间: 2006-12-18 1:05

#5

帖子 xblx » 2007-06-07 20:58

好是好,不过第一步就出现这么多错误。搞不去:

代码: 全选

liangzhdp@ubuntu:~$ cd '/home/liangzhdp/mplayer1.0'
liangzhdp@ubuntu:~/mplayer1.0$ apt-get source mplayer
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
读取状态信息... 完成
需要下载 10.3MB 的源代码包。
获取:1 http://ubuntu.csie.ntu.edu.tw feisty/multiverse mplayer 2:1.0~rc1-0ubuntu9 (dsc) [1569B]
获取:2 http://ubuntu.csie.ntu.edu.tw feisty/multiverse mplayer 2:1.0~rc1-0ubuntu9 (tar) [10.3MB]
获取:3 http://ubuntu.csie.ntu.edu.tw feisty/multiverse mplayer 2:1.0~rc1-0ubuntu9 (diff) [17.2kB]
下载 10.3MB,耗时 58s (176kB/s)
gpg: 于 2007年04月09日 星期一 19时55分40秒 CST 创建的签名,使用 DSA,钥匙号 7D2BCE85
gpg: 无法检查签名:找不到公钥
dpkg-source:正在解压 mplayer 于 mplayer-1.0~rc1
dpkg-source:正在解包 mplayer_1.0~rc1.orig.tar.gz
dpkg-source:正在应用 ./mplayer_1.0~rc1-0ubuntu9.diff.gz
liangzhdp@ubuntu:~/mplayer1.0$ sudo apt-get build-dep mplayer
Password:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
读取状态信息... 完成
注意,我选了 libdv4-dev 而非 libdv-dev
E: 不能满足软件包 mplayer 所要求的构建依赖关系。
liangzhdp@ubuntu:~/mplayer1.0$ sudo apt-get install liblive-media-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
读取状态信息... 完成
E: 无法找到软件包 liblive-media-dev
liangzhdp@ubuntu:~/mplayer1.0$  
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01

#6

帖子 xiechy » 2007-06-07 21:03

换源,
btw liblivemedia-dev,我凭记忆写的,有点笔误~sign
头像
内存不足
论坛版主
帖子: 3277
注册时间: 2005-08-18 18:43
联系:

#7

帖子 内存不足 » 2007-06-13 15:27

标记一下 mplayer 何时能自动加上中文界面 每次都要自己make才可以
໌→ iCookie Gtk Theme
໌→DropPlusBluetheme
กรัก กรัก`菠萝
头像
skyx
论坛版主
帖子: 9202
注册时间: 2006-12-23 13:46
来自: Azores Islands
联系:

#8

帖子 skyx » 2007-06-13 15:31

xiechy发功,必属精品。

感谢xiechy,感谢ustc, 感谢cctv ,感谢channel v
no security measure is worth anything if an attacker has physical access to the machine
头像
gnix_oag
帖子: 1994
注册时间: 2005-05-19 18:38
来自: 湖南永州
联系:

#9

帖子 gnix_oag » 2007-06-13 19:03

好,

能不能把 deb 传上来,
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01

#10

帖子 xiechy » 2007-06-14 10:15

内存不足 写了:标记一下 mplayer 何时能自动加上中文界面 每次都要自己make才可以
中文界面的补丁我没有用吧~我个人觉得不是很有必要~
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01

#11

帖子 xiechy » 2007-06-14 10:19

gnix_oag 写了:好,

能不能把 deb 传上来,
我用gutsy,估计大部分人的安装都不会成功吧,貌似libc又升了~依赖没法满足~不如兄弟你帮帮忙?要我做个干净的feisty太耗了(已经有个unstable的debtrap什么的了)
头像
zhuqin_83
帖子: 10606
注册时间: 2006-05-13 4:02
联系:

#12

帖子 zhuqin_83 » 2007-06-14 10:33

流媒体和wmv9格式的用vlc最好。
HP Pavilion DV6-2064CA: AMD Turion II Ultra Dual-Core Mobile M640, HD4650, 2GBx2 DDR2-800, Seagate 500GB 7200RPM SATA, BD-ROM
DELL UltraSharp 2209WA
Arch64, Testing repo
头像
jaywee
帖子: 517
注册时间: 2006-06-18 21:49
联系:

#13

帖子 jaywee » 2007-06-14 10:34

我安装了for firefox的插件也没有怎么设置,但流媒体播放没有任何问题!哈哈,人品极度爆发啊!
Time waits for no man!
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01

#14

帖子 xiechy » 2007-06-14 11:37

是中文url的解析~~很多校园网或者科学院的服务器用中文路径。
sonchonjay
帖子: 60
注册时间: 2007-04-12 23:20

#15

帖子 sonchonjay » 2007-06-23 22:21

不行,不知是我人品不行还是那里出错了,今天晚上搞了两遍都是编译错误!
NND,郁闷啊!
回复