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


  • administrators

    作为一个广播爱好者,想要在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有问题,有杂音. (非专业,说的不对请见谅.)


  • administrators

    试验了一下用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

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


  • administrators

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


  • administrators

    把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] ''
    >
    >>>
    

  • administrators

    用摩托罗拉手机电池供电播放电台和音乐,标称 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 命令输错,哈哈。



  • 为方便喜欢听网络广播的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,英语学习机等等.....



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


  • administrators

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



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

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



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



  • @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.