导入:wma定点解码mplayer -- 制作简单的网络收音机 (midas-zhou)

作为一个广播爱好者,想要在widora上听广播的想法是从这篇文章开始的 http://www.crystalradio.cn/thread-466848-1-1.html

原先在树莓派上装过mplayer来听广播,感觉非常不错,可以定时播放,用GPIO控制,很有玩头。 但是,在openwrt里用mplayer听广播的资料还是很少的,因为路由器的SOC内没有浮点运算单元,mplayer默认对wma格式音频的解码库是浮点的,解码方式必须改为定点解码,对我这种纯粹的业余玩家来讲,难度太大了。 机缘巧合,一天正好手头在玩widora, 突然在矿坛上发现了这篇文章,顿时兴趣大增,马上找到作者的QQ号, 发信息求教。 没想到nil大神很快回复了我,并且在网上找到wma定点解码的patch提供给了我,于是就开始折腾起来了。。。。。。。

第一次交叉编译通过的mplayer支持OSS音频系统,发现噪音比较严重,需要强制转换采样率,不过播放出来的音质非常不错。 我尝试着使mplayer支持ALSA音频系统, 试验了几次,好运降临,居然成功了,这次发现22.05k ,44.1k采样率的节目可以流畅播放,其他采样率的节目,比如48k,就有周期性的噪音。 现实无完美,总是会有缺憾啊!

现在将源码和执行文件晒在这里,希望高手马能解决这些问题。也希望芒果哥能把widora的音频搞得更精彩点。
0_1477498200010_mplayer-alsa.rar
0_1477498205114_mplayer-oss.rar
源码在这里:
http://pan.baidu.com/s/1o8B2S0y44

mplayer-alsa杂音问题是alsa没有配置好,需要在/etc下建立asound.conf文件,内容如下:

pcm.!default {
type plug
slave.pcm “dmix”
}

再播放mplayer-alsa,各种采样率的节目都OK了! 当然也有缺憾,就是非48k采样率节目启动时间较长,因为mixer默认先自动转成48k的采样率, 也可以自己设成44.1k等。

说明alsa的mixer通道(应该也是调用mmap) 是正常的. 程序直接走alsa的声卡通道hw:0,0有问题,有杂音. (非专业,说的不对请见谅.)

@freshmangdut 试试下面:

  1. 把这里的这个包 https://github.com/midaszhou/mplayer_pack 克隆放到~/openwrt_widora/package 下面。

  2. 然后在~/openwrt_widora/.config 配置文件中增加一行:
    CONFIG_PACKAGE_mplayer_pack=m
    即让系统编译成独立模块,如果要编入固件就写y.

  3. 在~/openwrt_widora目录下执行 make package/mplayer_pack/compile V=99
    成功的话会在 ~/openwrt_widora/bin/ramips/packages/base 目录下生成ipk安装文件.

    关键是mplayer_pack下的Makefile文件,我也是试了多次,针对编译中缺少库的提示直接在Makefile中写了链接位置让它能找到,做法比较傻。
    抛砖引玉,希望高手可以写个比较标准的Makefile.

你好,请问能请教下mplayer怎么移植到widora上吗?网上找了许久资料都没啥进展

发现用mplayer在暂停播放或发生underflow时候,会不断重复播放缓存中的一小段数据,不知道是FIFO pipe的原因 还是aplay的原因. 旧版的widora系统没有这问题.

如何制作ipk文件见:
http://sns.widora.io/topic/70/如何将一个应用程序添加到widora-openwrt源代码体系中/9

如果有做好的固件的话我都迫不及待的想刷进去玩了

用 alsamixer 或 amixer set 3D on / amixer set 3D 15 可以得到3D音效
郑州音乐台的3D音效非常棒! mms://218.28.9.99/yinyue

为方便喜欢听网络广播的widora-neo玩家,这两天试着将mplayer整合到widora最新固件中,目前只是将编译完成后的mplayer和相关文件放在widora根目录的files/mplayer文件夹中,然后编译打包固件。自己试用了一下,感觉还是挺好用的,现将固件分享在这里。http://pan.baidu.com/s/1i57INGT

使用说明:
0. 在刷入新固件前,有必要的话请备份你的widora系统: dd if=/dev/mtd3 of=/tmp/firmware-backup.bin 把它保存到电脑或u盘中以备后用。

  1. 刷入新固件,用connect2ap SSID PASSWORD 命令连接上网络.

  2. 启用SSH (这一步不做也没关系,主要为了方便,从串口登录会跳出很多信息。)
    2.1 编辑防火墙设置 vi /etc/config/firewall 将里面的reject改称ACCEPT,
    2.2 然后重启下firewall 运行命令: /etc/init.d/firewall reload
    2.3 用passwd命令设置一下root密码
    2.4 从ssh登陆widora

  3. ls /mplayer 看一下根目录下mplayer, 里面已经存放了所需的文件和一点mms广播地址。

  4. 用alsamixer 命令调节好Speaker或Headphone的音量,不然音量太大,可能得吓你一跳!

  5. 用mplay命令播放网络广播,有的节目可能要稍等一会。
    5.1播放单音轨广播节目,比如
    /mplayer/mplay mms://58.211.0.53/948 (自在苏州)
    5.2播放多音轨广播节目,比如:
    /mplayer/mplay -aid 2 mms://mediasrv1.iptv.xmg.com.cn/yinyue (厦门音乐 第2音轨. 目前只有厦门各台是多音轨的)
    5.3播放广播节目列表 (radio.list已经放在mplayer目录下)
    /mplayer/mplay -playlist /mplayer/radio.list
    5.4 播放playlist时候可以登录到另一个ssh,用echo向mplayer发送指令 (最好用screen将mplayer放到后台)
    比如 向前移动2个节目:
    echo “pt_step 2” >/mplayer/slave
    比如 静音:
    echo mute >/mplayer/slave (再发一次可解除)

  6. 播放mp3
    比如 /mplayer/mplay /usb/1.mp3
    (也可以先用 ls -1 /usb/*.mp3 >mp3.list 做一个playlist,然后再来播放)

  7. 建议安装screen, 这样可以让mplayer在后台运行 ,即使你退出ssh它也不会退出。 可以用命令直接下载:wget http://downloads.openwrt.org/chaos_calmer/15.05.1/ram
    ips/mt7688/packages/packages/screen_4.3.1-1_ramips_24kec.ipk
    (也可以 在这里下:)
    然后安装: opkg install screen_4.3.1-1_ramips_24kec.ipk
    mplayer放入后台运行:screen /mplayer/mplay -playlist radio.list (ctrl+a 再按下d)
    用echo发指令给后台的mplayer可以实现换台,调音量,静音等功能。

其他: 参考下网络上mplayer的使用方法,可以灵活地把widora-neo打造成自己喜欢的音乐盒,mooring caller,英语学习机等等…

用摩托罗拉手机电池供电播放电台和音乐,标称 3.8V 1735mAh, 续航力~3小时50分

点击听MP3视频

点击听网络电台视频

目前发现mplayer播放32kbps流/44.1K采样率的节目会有"兹拉"声,似乎是wma定点解码库的问题。
可以试验下:
-------------------- 播放下面的节目有"兹拉"声 ------------------------
陕西新闻广播 mms://218.30.15.203/news ---- 32kbps — 44.1k ---------
陕西陕广新闻 mms://218.30.15.203/city ---- 32kbps — 44.1k ---------
陕西经济广播 mms://218.30.15.203/encnomy ---- 32kbps — 44.1k ---------
陕西交通广播 mms://218.30.15.203/traffic ---- 32kbps — 44.1k ---------

-------------------- 播放下面的节目 OK ------------------------
陕西音乐广播 mms://218.30.15.203/music ---- 48kbps — 48k ---------
陕西农村广播 mms://218.30.15.203/country ---- 48kbps — 48k ---------
陕西戏曲广播 mms://218.30.15.203/opera ---- 48kbps — 48k ---------
陕西青春广播 mms://218.30.15.203/kids ---- 48kbps — 48k ---------
陕西故事广播 mms://218.30.15.203/story ---- 48kbps — 48k ---------

以此搞一个小结。
手机APP控制mplayer
点击看视频 http://player.youku.com/player.php/sid/XMTcwNTg3MzE2MA==/v.swf

…pause 命令输错,哈哈。

把mplayer运行在后台的slave模式,然后用python控制它,下载个手机TCP控制APP, 这样就可以遥控了。。。。(开关显示多余)
0_1477498354934_d6bd6e08b4ca1731afdebff03321e2689d21d5a9_1_293x500.JPG

详见《Python 核心编程》 -Wesley J Chun

TCP实现时间戳服务器和客户端
2013-02-01 作者:sam_linux
[python]代码库
view sourceprint?

#! /usr/bin/env python
#服务器(tsTserv.py)
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
    print 'Waiting for connection...'
    tcpCliSock,addr = tcpSerSock.accept()
    print '...connection from:',addr
    while True:
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        tcpCliSock.send('[%s] %s' % (ctime(),data))
        #tcpCliSock.close()  不关掉会报错
tcpSerSock.close()

=====================================================

#! /usr/bin/env python
#客户端(tsTclnt.py)
from socket import *
HOST = '192.168.1.190'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
    data = raw_input('> ')
    if not data:
        break
    tcpCliSock.send(data)
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print data
tcpCliSock.close()

==========================================================
服务器运行

[root@dogood core16]# python tsTserv.py
Waiting for connection...
...connection from: ('192.168.1.110', 1050)
Waiting for connection...

==========================================================
客户端运行

>>>
> How do you do?
[Thu Jan 31 06:46:27 2013] How do you do?
> 我很好
[Thu Jan 31 06:46:40 2013] 我很好
> ''
[Thu Jan 31 06:46:50 2013] ''
>
>>>

2_1477498305910_774e99bad977684bb798a3dae3781dc332d1ce0c_1_690x413.jpg 1_1477498305909_378a0c54293bc05cd9ebc182d471b1a40a4224f9_1_666x500.jpg 0_1477498305909_66c5a25302f575521fe3e9c204e3f72c40f91d0e_1_666x500.jpg

试验了一下用GPIO控制 视频:widora-网络收音机-试验 视频

mplayer-alas通过dmixer的方式播放需要经过一步采样率转换 (如果你的alsa内设dmixer的采样率是48k的话,那么44.1k,32k,22.05k等采样率的节目加载就比较慢),对于没耐心的听众来说简直是折磨! 下面提供的方法保证可以快速播放:

先建立一个fifo管道:
mkfifo -m 777 /home/radiofifo

让mplayer-oss输出pcm到radiofifo:
./mplayer-oss -ao pcm:file= /home/radiofifo -cache 512 -cache-min 5 mms://192.192.159.129:8080 &
(后面加&,让它在后台运行。cache可以自己设,不过我觉得这样最佳。)

用aplay播放radiofifo (你的widora中应该装有alsa系统,aplay是alsa的一个工具.)
aplay -M /home/radiofifo
可以听到干净利落的声音了吧!

把以上的结合起来,写一个脚本 fplay (怎么写? 复习一下shell和linux吧,我也是常忘。)
然后就可以直接这样:
fplay mms://218.28.9.99/yinyue

是不是很爽阿!
另外,还是期待老大发表完美音频版. 这样,以上的种种都可以免了.