代码: 全选
#!/bin/bash
## NAME: nettv.sh
## Author: zwhuang
## Email: zwhuang@gmail.com
## Dated: (Oct. 23, 2006)
## USAGE: use IP address as input, the same as ``nmap''
##
## nettv.sh -i 222.20.220.0/24
## or
## nettv.sh
##
PROG_NAME=nettv.sh
IP_ADDRESS=NULL
TMPFILE=/tmp/nettv.tmp
LSTFILE=/tmp/nettv.lst
LSTFLAG=0
PLAY_IT=1
## Usage; ##{{{
usage()
{
echo " [Usage]: nettv.sh [-h] [-d] [-i ip_address] [-f ip_listfile]"
echo ""
echo " -i specify the (i)p_address to be scanned;"
echo " -f use an ip_list (f)ile;"
echo " -d (d)aemon mode, only gets IPs, doesn't call mplayer."
echo " -h (h)elp message;"
echo ""
exit 1
}
##}}}
## GetOpts; ##{{{
while getopts "i:f:dh" opt
do
case $opt in
i) IP_ADDRESS=$OPTARG;;
f) LSTFLAG=1
LSTFILE=$OPTARG;;
d) PLAY_IT=0;;
h) usage;;
?) usage;;
esac
done
##}}}
if [ $LSTFLAG -eq 0 ] && [ "$IP_ADDRESS" != NULL ];then
# getting valid IP address' with port 8888 open;
nmap "$IP_ADDRESS" -p 8888 -oG $TMPFILE > /dev/null
grep open $TMPFILE | sed 's/Host: \([0-9.]*\).*/\1/g' > $LSTFILE
fi
if [ ! -r $LSTFILE ];then
echo "*** The NetTV IP list file [$LSTFILE] seems not reachable."
echo "*** You'd better run <$PROG_NAME> with [-i ip_address]."
exit 1
fi
# playing the video resource of these IP's one by one;
# you can switch to the next one by pressing ``q'' to quit from the present
# video;
cat $LSTFILE
if [ $PLAY_IT -eq 1 ];then
for OPENIP in `cat $LSTFILE`
do
echo ">>> Playing NetTV [#] $OPENIP"
mplayer -nortc -ontop -afm dmo http://$OPENIP:8888/1.asf > /dev/null
sleep 0.25
done
fi
# vim:fdm=marker:fmr=##{{{,##}}}:tw=78
grep 提取出包含可以访问的 IP 的条目,并且用 sed 截取 IP 地址,输出到一个临时
的 IP 列表文件。通过循环来逐一播放相应 IP 的视频资源。
之前会将可用的 IP 列表列出,并且显示正在播放资源的 IP。播放的文本信息通过
/dev/null 屏蔽,每个源的播放间隔为 0.25s,以便程序退出和启动的缓冲。
通过 -i 选项来指定 IP 就会重新扫描可用的 IP 资源,更新列表文件,重新开
始播放视频资源上的视频。通过 -f 选项来指定 IP 列表文件,则会跳过 IP 扫
描,直接使用列表文件中的 IP 来尝试播放。如果不指定 IP 和列表文件,则不进行扫描
,直接访问默认的旧的列表文件,可以达到瞬时显示的效果。播放频道的切换可以通过
mplayer 的退出当前视频快捷键 q 来实现。退出一个播放视频后,延时 0.25s 后启动
下一个视频资源的播放,相当于看电视的换台操作。
再附加一点,pplive 可以开多个频道共享,也就是同时开多个端口映射来播放多个节目
。那么,怎样知道这些端口呢?其实这个问题比较简单,端口是又 8888 顺序往后分配的
。也就是,默认的节目是映射到 8888 端口的,之后打开的共享节目映射到端口 8889,
再后是 8890,依次类推。扫描的方法也很简单:
代码: 全选
$ nmap -p 8888-8893 $IP_ADDRESS
是不会开多个节目的!