用Raspberry Pi打造真正的“豆瓣FM”

想用床头的收音机收听豆瓣FM吗?如果你有一台Raspberry Pi,这个愿望就可以满足。

Raspberry Pi,中文名树莓派,是一台廉价的单板机,ARM架构,可以运行Linux操作系统,它由英国的树莓派基金会开发,目的是以低价硬件及自由软件促进校园中的计算机科学教育。是的,它设计初衷其实是给小朋友们学电脑用的,不是给你们这些Geek来折腾玩的。

用Raspberry Pi搭建一个豆瓣FM的调频广播台其实并不是一件很困难的事情,为实现这个目标,要解决的两个问题是:

  • 从豆瓣FM网站上下载MP3音乐码流并解码
  • 把音频信号调制成调频信号发射出去

造轮子的事情不要自己做,这两个问题其实已经都解决了:Github上的fmd项目实现了一个通过本地声卡播放豆瓣FM的服务器;这篇文章则介绍了如何写程序对音频信号进行调制并控制Raspberry Pi的GPIO端口把信号发送出去。所以剩下的事就是把它们组合起来就可以了。

组合代码这种脏活累活我也给大家做好了,可以从Github上获取。嗯,这份代码目前的质量是It just works,各位make一下就好,没事就不要vim它了……

git clone git://github.com/lifanxi/fmd.git

代码下载后在Raspberry Pi上可以直接make编译,如果缺少依赖,可能需要安装libcurl4-openssl-dev, libjson0-dev, libmpg123-dev, libao-dev这些依赖包(我用的是Raspbian发行版)。

fmd的使用方法可以参考Github上的说明,我所实现的扩展就是在fmd.conf配置文件中可以把driver配成”pifm”,然后把device配成88MHz~108MHz之间的某个指定的调频发射频率值(这是大多数国家调频收音机所支持的频率范围,如果你有别的无线电接收设备,这个值也可以设成是<250的任意值)来实现FM广播的发射。当driver配成pifm而不是默认的alsa时,fmd就会工作在FM广播模式。

注意,由于FM发射的代码需要直接mmap /dev/mem设备,所以把driver配成pifm让fmd工作在FM广播模式时,需要以root权限来执行fmd。以root权限运行fmd时,注意HOME目录可能会变成/root,所以相关配置文件也得改放到/root/.fmd中。

fmd运行起来后,按照文档的说明,可以telnet到127.0.0.1:10098上或用fmc执行play命令开始广播,把收音机(带收音功能的手机当然也可以)调到device参数所指定的频率上就可以收听了。

如果你的收音机离你的Raspberry Pi太远,收音效果不好,可以在Raspberry Pi主板上的GPIO 4口上插一根20cm左右长的杜邦线做天线,广播范围和信号强度就会大大提高了。

Raspberry Pi正在102.4 MHz上播放豆瓣FM的音乐

Raspberry Pi正在102.4 MHz上播放豆瓣FM的音乐

目前这个豆瓣FM广播台还有两个大问题需要解决:

  • 立体声调频广播:现在实现的版本是单声道的,理论上应该也可以把音频调制成立体声的。这需要一些我所不具备的调频广播的知识,待我有空再钻研钻研。
  • CPU占用率:现在的版本在做调制和发射时,对CPU的占用率比较高。如果Raspberry Pi正在忙于做别的事情的话,你可能会听到一些杂音或者是唱机/磁带机没电了的时候的音响效果。

其实吧,这样收听豆瓣FM可真是多此一举。直接把耳机插在Raspberry的耳机插孔用fmd播放不就完事了么……天行健,君子以折腾不息!

用Raspberry Pi打造真正的“豆瓣FM”》上有100条评论

  1. ./fmd: error while loading shared libraries: libmpg123.so.0: cannot open shared object file: No such file or directory 出现这个怎么解决,我没法用apt-get install来安装,所有的库都是我自己下载然后编译的,你能提供一下这个库么

    • 既然都是您自己编译安装的,那libmpg123您肯定是安装了的吧,不然fmd编译也过不了啊。找找看libmpg.so.0在你的/usr/local/lib等目录中都没有吗?尝试指定一下LD_LIBRARY_PATH试试?
      http://www.freemindworld.com/tmp/libmpg123.so.0 可以下载我的Pi上的对应文件,该地址有效期10天,我的系统是Raspbian(Hard-float)。

      • 是啊,一开始fmd编译不通过,我一个一个下载库的源码然后编译,每编译一个库安装后我都尝试一次fmd的编译,最后fmd编译成功不报错了,运行的时候就提示没libmpg.so.0这个文件。我一开始安装的是libmpg的最新版,直接执行mpg123报错也说找不到libmpg.so.0。后来我下载了个比较旧的0.68版,编译安装后可以执行mpg123,但是fmd仍然说缺那个文件。
        另外我的系统也是Raspbian(Hard-float),我没法通过apt-get update来更新软件源,总是会提示checksum mismatch。换了几个源也不行。有法解决么,我ubuntu上也存在这个问题,听说是墙导致的。

        • deb http://raspbian.caro.net/raspbian/ wheezy main contrib non-free rpi
          这是我目前在用的源,工作正常。之前是用清华的源,现在好像不能用了。
          Checksum mismatch我以前电脑上用Debian时在公司的网络上也时不时发生,在家里就没问题,我怀疑是某些网关设备的问题。
          mpg123可以用但还是报没有libmpg.so.0的话,看看mpg123编译时是不是用了静态链接了?用ldd查查mpg123有没有链接到libmpg.so.0,或者干脆全盘找找libmpg.so.*看看。

  2. 新的问题又来了,我telnet
    Trying 192.168.1.141…
    telnet: connect to address 192.168.1.141: Connection refused
    telnet: Unable to connect to remote host
    这个怎么办?fmc因为我不是linux系统也没法用,在树莓派上编译成功,但是运行提示Illegal instruction。还有我怎么能使用音频输出口来播放,而不是用fm呢,我直接用alsa和default提示找不到设备。

    • telnet时指定了跟配置文件中一致的端口号吧?可以到~/.fmd目录中看看自动生成的log文件,看有没有什么有用的信息。Connection refused意味着你所telnet的端口没有打开,多半是进程没有起来吧。
      我没遇到过Illegal instruction的问题,这个感觉像是编译链接时没有指定正确的平台,但既然你是在Raspberry Pi上编译的,那理论上不应该有这个问题。
      我在我的笔记本的Linux上用alsa和default会报找不到设备,但在Raspberry Pi上是正常的,我没有深入看过这个问题的根本原因……抱歉。

      • 重启了一下现在能telnet上了,输入info有正确显示,但是输入play后现实Connection closed by foreign host.然后就再也连不上了,直到重启

        • 这是因为play以后进程挂掉了…具体为什么会这样我就不清楚了,如果要分析,得收集一下core dump文件,然后用GDB来调试。
          您现在是用pifm模式还是alsa模式在执行play后进程挂掉?如果是pifm模式,要记得用root权限哦。

          • 我发现了一样的问题,在 play 后就立马 fmd 进程挂掉。不管工作在pifm 还是 alsa。 请问怎么收集core dump 日志呢。正好在play 是挂点很纠结。

          • 在运行fmd前,先ulimit -c unlimited,然后再运行,如果crash,会在当前目录下生成core文件。然后就可以用GDB来分析了。

          • 搞定了,play 退出的原因是 主要是 rate 设置的不对。只能12000 24000 6000 好像。我设置了 24000 好了,fmd.err 报出了错误。我已debug 模式编译的。还是非常谢谢你的教程!

          • 一样的问题!!Robin所说的rate设置在哪?

  3. 你好

    我在ubuntu上试着make fmd,我添加了要求的libs,但是现在遇到这个问题,谢谢

    gcc -Wall -o fmd app.o config.o player.o playlist.o server.o util.o -lcurl -ljson -lmpg123 -lao -lpthread
    playlist.o: In function `fm_song_parse_json’:
    playlist.c:(.text+0x130): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x138): undefined reference to `json_object_get_string’
    playlist.c:(.text+0x15b): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x163): undefined reference to `json_object_get_string’
    playlist.c:(.text+0x187): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x18f): undefined reference to `json_object_get_string’
    playlist.c:(.text+0x1b3): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x1bb): undefined reference to `json_object_get_int’
    playlist.c:(.text+0x1d3): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x1db): undefined reference to `json_object_get_string’
    playlist.c:(.text+0x1ff): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x207): undefined reference to `json_object_get_string’
    playlist.c:(.text+0x22b): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x233): undefined reference to `json_object_get_string’
    playlist.c:(.text+0x257): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x25f): undefined reference to `json_object_get_int’
    playlist.c:(.text+0x277): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x27f): undefined reference to `json_object_get_int’
    playlist.o: In function `fm_playlist_parse_json’:
    playlist.c:(.text+0x53d): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x545): undefined reference to `json_object_get_int’
    playlist.c:(.text+0x55f): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x567): undefined reference to `json_object_get_string’
    playlist.c:(.text+0x59e): undefined reference to `json_object_object_get’
    playlist.c:(.text+0x5a6): undefined reference to `json_object_get_array’
    playlist.c:(.text+0x5ca): undefined reference to `array_list_get_idx’
    playlist.c:(.text+0x60e): undefined reference to `json_object_put’
    playlist.o: In function `fm_playlist_send_long_report’:
    playlist.c:(.text+0x937): undefined reference to `json_tokener_parse’
    collect2: error: ld returned 1 exit status
    make: *** [fmd] Error 1

    • 我看不出有什么原因,一样的命令在我的Arch Linux和Raspbian上都没有问题。
      只能猜测一下是不是Ubuntu的libjson版本不兼容?

  4. 解决了,犯了低级错误,channel id写错了,改成0 私人兆赫就正常了

  5. 你好

    我编译成功了
    但是cat fmd.err
    open audio output: no such file ot directory

    你知道这是为什么吗

    谢谢

    • 你是在虚拟机下编的?你确认一下虚拟机里有没有音频设备,ALSA是不是工作正常。从你的错误日志并结合代码来看,可能是ALSA设备初始化失败了。

      • 你好

        是的,我在virtualbox里面装的debian

        请问,这个fmd运行的时候会下载歌曲并保存吗?还是直接读取?

        谢谢

        • 直接就把下载的音乐数据用mpg123解码然后输出到ALSA播放了。如果您想保存下来的话,自己加点代码就可以了,应该不会太困难。

          • 我今天收到raspberry pi了
            一切编译正常,只是感叹这玩意儿真的好慢

            我运行fmd没有错误
            然后运行fmc play
            fmd.err里面出现了API error: expired

            这是怎么回事?很期待能听到歌曲

          • 回复的嵌套层数到最大值了,只能回复前一条了。

            这个错误是从豆瓣API那里返回过来的,看字面意思可能是你的token过期了吧。按FMD的文档把~/.fmd/fmd.conf中的[DoubanFM]段中的那些值重新获取一遍改一下试试看。

  6. 你好

    我试过这个,token换了几个了, 但是每次都说过期了

    正常的情况,是不是fmc play时候,就能从pi上连接的音箱里出来音乐

    谢谢

    • 正常情况下,fmc play后,RPi上接的音箱应该出声了。当然你需要确认一下你的driver配的是alsa,device配的是default。

      我没办法重现你的问题,试来试去都是好的。
      你可以试试人工代替fmd来访问豆瓣FM获取播放列表试试。
      curl -v ‘http://www.douban.com/j/app/radio/people?app_name=radio_desktop_win&version=100&user_id=_uid_&expire=_expire_&token=_token_&channel=_channel_&sid=0&type=n&h=’
      把你的fmd.conf中的uid,expire,token,channel这几个配置项的值换进去看看,看能不能得到一个有效的音乐列表。
      再不行,只能建议您自己gdb或在fmd中多加一些调试信息打出来看看是什么原因了。

  7. fmc play

    cat fmd.log
    server has a new clint from 127.0.0.1:37365
    server receives from client 127.0.0.1:37365 => play
    playlist next song
    playlist init empty, request new
    playlist send long report: 0:n

    cat fmd.err
    api error: expired

    换的新的token

    如果我从另外一个电脑telnet,也连不上

    telnet 192.168.1.117 10098
    Trying 192.168.1.117…
    telnet: connect to address 192.168.1.117: Connection refused
    telnet: Unable to connect to remote host

    • [Server]
      address = localhost
      port = 10098
      这里address配的是localhost的话,10098端口只在本机侦听,远程是连不上的。
      如果要在别的机器上连,把address改成0.0.0.0

  8. 我把fmd.conf里面等号两边的空格都去掉,现在可以了。
    运行fmc play可以看到在播放一个歌曲,但是现在没有声音。

    我需要做什么其他的吗

    谢谢

  9. 我搞定了!!!

    重启了一下(第一次重启)

    有声音了

    非常感谢你的耐心指教!!!

  10. 我在学习着你这个实验,但是libjson0-dev 这个包我们找不到,上网找了好多个都说跟系统版本不对,求帮助T~T

    • 你们用的是什么系统呢?是Raspbian吗?别的系统中包名可能不一样。
      如果是Raspbian的话,有没有先apt-get update一下后再apt-get install试试?

  11. update完了,还是这样的错误 You might want to run ‘apt-get -f install’ to correct these:
    The following packages have unmet dependencies:
    libcurl4-openssl-dev : Depends: libcurl3 (= 7.31.0-2) but 7.26.0-1 is to be installed
    Depends: libidn11-dev but it is not going to be installed
    Depends: libkrb5-dev but it is not going to be installed
    Depends: libldap2-dev but it is not going to be installed
    Depends: librtmp-dev but it is not going to be installed
    Depends: libssh2-1-dev but it is not going to be installed
    Depends: libssl-dev but it is not going to be installed
    libjson0-dev : Depends: libjson0 (= 0.10-1.2) but 0.9-1.1 is to be installed
    E: Unmet dependencies. Try ‘apt-get -f install’ with no packages (or specify a solution).

    • 这个感觉是libcurl3的版本问题,系统中的版本太低。先apt-get upgrade更新一下系统再apt-get install试试。

      另外,按提示apt-get -f install试试。

      • 一样的错误~@~@要晕了~upgrade了不行,加-f也不行。不过我其中有一个同学成功了。他好像搞了这个tar zxvf json-c-0.9.tar.gz
        cd json-c-0.9/
        ./configure –prefix=/usr/local/json-c-0.9(没有prefix选项,默认的是/usr/local/lib/)
        make && make install
        echo “/usr/local/json-c-0.9/lib/” > /etc/ld.so.conf.d/json-c-0.9.conf
        echo “/usr/local/tokyocabinet-1.4.33/lib/” > /etc/ld.so.conf.d/tokyocabinet-1.4.33.conf

        /sbin/ldconfig

        • 我怀疑你现在问题就是apt-get的数据有点乱,有些依赖满足不了,装包就不正常了。你可以搜索学习一下apt-get的一些用法,看怎么把它从异常情况下恢复到正常。这个具体的我也不是很熟悉,所以没办法给出立杆见影的建议。

          你同学的做法就是自己编译了一个libjson的包来使用,不用deb的包安装,这也是可行的。

          • 感觉我知道问题关键了,要先把 libjson0-dev装了,才可以装的~我刚才remove了之前安装的libcurl4-openssl-dev,现在就可以了~太感觉你了T~T。我还是超级超级的菜鸟,请以后多多提点。感谢感谢感谢你~

      • libjson0-dev : Depends: libjson0 (= 0.10-1.2) but is to be installed
        是不是这句话的问题~我是不是没有装0.9-1.1?

        • 我的理解是要装的libjson0-dev依赖0.10-1.2的libjson0,但你的apt-get中记录要装0.9-1.1的libjson0,两者不匹配。这个问题印象中apt-get -f install应该是可以解决的。

  12. gcc -Wall -c app.c
    In file included from app.c:2:0:
    player.h:6:23: fatal error: curl/curl.h: No such file or directory
    compilation terminated.
    make: *** [app.o] Error 1

    我make之后为什么会是这错误 求助啊啊啊

      • 嗯嗯 是的忘记装了。。我make好了之后
        root@raspberrypi:/home/pi/fmdd# ./fmd
        root@raspberrypi:/home/pi/fmdd#
        没有反应啊。。

        • 请参考fmd的使用说明,做相关的配置等。fmd正常运行时就是在后台的,需要用fmc或telnet来操作它,请参考fmd项目的说明。

          你可以先用alsa设备用本地音频输出调试到没问题了再改成FM发射。

          请记住用FM发射的话需要root权限,配置文件也会跑到/root下,请参考本文正文中的说明。

  13. 唉 不会弄这个telnet 我的电脑提示没有这个指令 我弄FMC make的时候出现这个错误pi@raspberrypi ~/fmc $ make
    gcc -Wall -o fmc fmc.o -ljson-c -lcurl
    /usr/bin/ld: cannot find -ljson-c
    collect2: ld returned 1 exit status
    make: *** [fmc] Error 1
    = = 明明fmd都make好了啊。。大神求组啊~~

    • 你可以在Raspberry Pi上直接telnet 127.0.0.1 10098,不是非要从另一台电脑上的。

      fmc编译失败是因为找不到 libjson-c.so啊,可以修改一下Makefile,在LIBS变量中用-L参数指定一下libsjoin-c.so所在的目录,然后再编译就可以了。

        • 似乎在新版的Raspbian中libjson-c的打包方式跟文中所说的已经有所出入。具体的因为暂时手头没有RPi无法验证,请自行调整一下依赖库。

          -L后面是直接跟.so所在的目录就可以了。

  14. 我的依赖包搞好了~但是又说我空间不足T~T。
    gcc -Wall -c playlist.c
    /tmp/cc4eO0Uf.s: Assembler messages:
    /tmp/cc4eO0Uf.s: Fatal error: can’t write playlist.o: No space left on device
    /tmp/cc4eO0Uf.s: Fatal error: can’t close playlist.o: No space left on device
    make: *** [playlist.o] Error 1

    求助求助~

    • 你在/tmp下编译的?放到自己的主目录或其它剩余空间大的目录下编呗。

      另外,如果你是2G以上的SD卡,装好系统后有没有用raspi-config工具扩展过根分区呢?没扩展的话,可用空间很小的。当然也可以自己用fdisk分一个新的分区,mount到指定的目录上来扩展空间。

  15. root@raspberrypi:~/.fmd# cat fmd.log
    Player audio driver: Advanced Linux Sound Architecture (ALSA) output
    Player sample rate: 44100 Hz
    Server listen at localhost:10098
    Server has a new client from 127.0.0.1:36744
    Server receives from client 127.0.0.1:36744 => play
    Playlist next song
    Playlist init empty, request new
    Playlist send long report: 0:n
    root@raspberrypi:~/.fmd# cat fmd.err
    open config file: No such file or directory
    API error: expired
    root@raspberrypi:~/.fmd# ls
    fmd.conf fmd.err fmd.log
    这个错误提示好矛盾啊。。又说找不到config。。又说API过时。我试过你上面给的那个网址,配置中的可以获取到播放列表。这个fmd.conf是不是就只有
    [DoubanFM][Output][Server]这3个就ok了呢。

    • 配置文件看起来好像是找到了呀,你可以试着把fmd.conf中的port换成别的,然后看看fmd.log中打出来的日志有没有变成新的port来判断配置文件有没有正确的解析。
      API error:expired基本上意味着uid,token和expire这三个参数没有配置正确,按文档上的说明重新获取一次并配置进去试试看。

      • 改了.发现是没有解析.我怀疑是我的配置文件写错了.文档上面不是给了范例了吗,不是按照Please create a config file before using FMD. A sample config file is:这句下面的格式去写的吗

        • 配置文件就是那么写的。要不你再确认一下配置文件和它所在的.fmd的权限?

          其它貌似看不出什么问题了,需要的话,你可以加我的QQ 3058575,然后我给你远程协助分析一下。如果你自己会用gdb的话,也可以用gdb来跟踪调试一下fmd,看是哪一步的问题。

  16. 请问在ubuntu上链接错误:
    player.c:(.text+0x486): undefined reference to `mpg123_encsize’
    是怎么回事?

      • 问题解决了,缺省安装的是0.25的库,这个变量是0.26之后加的,remove后下载最新的源码编译安装就ok了,谢谢!

      • 不过这个代码在raspberry上工作的很好,但是ubuntu上老是:
        Trying 127.0.0.1…
        telnet: Unable to connect to remote host: Connection refused
        不知道是否支持ubuntu?

        • 这个出错提示表示对应的端口没有监听,基本上意味着fmd进程没启动成功。

          我没在Ubuntu下试过,理论上不应该不能执行。最多可能是一些细微的地方要调整下。你有没有试过用最新的代码:https://github.com/hzqtc/fmd

    • 我现在是把apt源改成http://blog.csdn.net/spaceship20008/article/details/8458221这样然后sudo apt-get update就可以了,直接sudo apt-get update不知道行不行

      • 直接sudo apt-get update就行了。
        您一开始遇到的问题在于软件源中的版本已经更新,但本地的软件目录中没更新。apt-get update就是用来更新本地软件目录的。

  17. Pingback引用通告: FMD–A DoubanFM Server(1) | Miibotree's Thinking

  18. Pingback引用通告: FM Transmitter Lib – A DoubanFM Server(2) | Miibotree's Thinking

  19. 谢谢作者的博客,按照您的博客来终于成功实现了!还有上次在图书馆见到你翻译的新书才萌发出玩Raspberry的想法,总之您应该算是我的启蒙老师啦。十分感谢~~~

  20. fmd的文件好像改过了,看github上的说明不知所云。不知道怎么编译,请指教==

  21. 运行fmc play 和 fmd play 均出现下面的错误,make release 成功了
    -bash: fmc: command not found

    • 你漏了./吧?
      在Bash中,默认不会把当前目录加在PATH中。所以,执行当前目录下的程序时,需要明确指定路径。比如:./fmc play

  22. make release 结果

    root@raspberrypi:/home/pi/Desktop/douban.fm/fmd# make release
    gcc -Wall -O2 -c app.c
    gcc -Wall -O2 -c config.c
    gcc -Wall -O2 -c pifm.c
    pifm.c: In function ‘fm_setup_fm’:
    pifm.c:119:5: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
    gcc -Wall -O2 -c player.c
    gcc -Wall -O2 -c playlist.c
    gcc -Wall -O2 -c server.c
    server.c: In function ‘fm_server_run’:
    server.c:146:32: warning: ‘client’ may be used uninitialized in this function [-Wuninitialized]
    gcc -Wall -O2 -c util.c
    gcc -Wall -O2 -o fmd app.o config.o pifm.o player.o playlist.o server.o util.o -lcurl -ljson -lmpg123 -lao -lpthread -lm

    • 这是fmd的编译过程,看起来应该是成功的。完成后可以用sudo ./fmd来启动它。
      fmc的话,是另一份代码,编译好后可以直接./fmc 来运行。

  23. root@raspberrypi:~# cat .fmd/fmd.err
    Open audio output: No such file or directory

    mplayer 播放mp3文件声音正常,不知是哪里出错了

  24. root@raspberrypi:~# ./fmd play
    root@raspberrypi:~# telnet localhost 10098
    Trying 127.0.0.1…
    Connected to localhost.
    Escape character is ‘^]’.
    play
    Connection closed by foreign host.

    telnet进入后无论键入任何命令都会返回 Connection closed by foreign host. 求解答

    • telnet断开以后,是不是fmd的进程就不在了?如果是这样的话,基本上就是因为fmd进程出错退出了。具体的原因得看一下fmd的日志。如果日志中没有相关的信息,那就只好上gdb调试了。可以收集一下fmd出错的core dump,然后用gdb分析一下。但是gdb具体的调试方法就没办法在这里展开描述了,抱歉。

  25. root@raspberrypi:~/.fmd# cat fmd.log
    Config DoubanFM: channel => 0
    Config DoubanFM: uid => ****
    Config DoubanFM: uname => ******
    Config DoubanFM: token => *******
    Config DoubanFM: expire => ******
    Config Output: driver => alsa
    Config Output: device => default
    Config Output: rate => 44100
    Config Server: address => localhost
    Config Server: port => 10098
    Player audio driver: Advanced Linux Sound Architecture (ALSA) output
    Player sample rate: 44100 Hz
    Server listen at localhost:10098
    Server has a new client from 127.0.0.1:60736
    Server receives from client 127.0.0.1:60736 => toggle
    Player play
    Playlist next song
    Playlist init empty, request new
    Playlist send long report: 0:n
    Playlist next song
    Playlist init empty, request new
    Playlist send long report: 0:n
     
    这个能看出什么问题么~~

    • 疑似是没能正常获取播放列表。但具体的原因我看不出来。你可尝试下重新获取一下uid/token之类的,再试一次。
      你的留言中泄露了你的uid,username和token,我给你改成****了。

      • 谢谢,尝试过多次更换uid与token均是如此的结果,一直卡在这里无法进行了

  26. 此外 ./fmd play 正常情况下是会返回类似下面的信息么?

    {
    “len” : 0,
    “sid” : 967698,
    “status” : “play”,
    “channel” : 0,
    “like” : 0,
    “artist” : “花儿乐队”,
    “album” : “幸福的旁边”,
    “cover” : “http://img1.douban.com/mpic/s4433542.jpg”,
    “url” : “/subject/1404476/”,
    “user” : “小强”,
    “pos” : 5,
    “title” : “别骗我”,
    “year” : 1999
    }

    • 应该是类似于这样的:
      {“status”:”play”,”channel”:0,”user”:”小强”,”title”:”What’s My Name (Intro #1)”,”artist”:”Rihanna / Drake”, “album”:”Promo Only Rhythm…”,”year”:2010,”cover”:”http://img1.douban.com/mpic/s4615061.jpg”,”url”:”/subject/5951920/”,”sid”:1561924,”like”:0,”pos”:107,”len”:254}

  27. 你好,请问在cmd或者python os.system中如何给telnet localhost 10098 输入play stop 等命令呢,谢谢

  28. 两个问题:
    1、关于FM,如果给PI挂上一个U盘,里面全是音乐文件,然后把这个以广播的形式播放,是否可以实现一个自由的广播基站?比如我设定99为我的FM广播的播放频率,那么人们就可以收听我的99频道中的音乐了?
    2、可否就使用rpi控制固定电话拨号的议题,给点思路性的指示?

    • 1. 可以实现。只不过音质比较差,广播范围也比较小。本文所讨论的东西其实就是为了折腾玩,从实用性角度来说,没啥实用价值。
      2. 普通电话用DTMF来拨号,让RPi合成DTMF音频后输入到电话上,我想应该可以实现。

      • 1.感谢回复。还是希望关于DTMF信号转化的问题可以再深入的延展一下,我这方面的知识实在是太有限了。
        2.我现在用得是英国原版的256M内存的B版Pi。

        • 我也没有更多可以分享给你的,我没做过这方面的东西。
          用RPi产生DTMF音频很简单,你用Raspberry Pi DTMF关键词搜索就可以找到相关的代码,但是我不知道怎么才能把DTMF音频输入到电话线上,理论上用喇叭对着电话听筒外放就可以,不过这应该不是你想要的效果。你可能需要一些额外的简单电路来把DTMF信号接入电话线。
          另外还有一个思路就是用Raspberry Pi去驱动一个Modem来实现电话的功能,很多老式的串口Modem都提供语音功能,直接把它与Raspberry Pi的GPIO串口相接(需要做个电平转换电路),然后找个适当的软件,在Modem上接上耳麦直接就可以当电话用。

    • 编译 完 .fmd 在当前目录下是么?
      怎么运行fmd 我直接fmd 提示 bash: fmd: command not found 可是ls 有fmd

      • 在Linux中,当前目录默认不会放在PATH环境变量中,所以系统在找可执行文件时,不会找当前目录。要运行当前目录下的fmd,请用./fmd。

  29. Pingback引用通告: 极客以折腾不息的树莓派玩法 – CrackPi.Com 精通树莓派,香蕉派,各种卡片式电脑!

  30. pifm好像不支持pi3,不过用https://github.com/markondej/fm_transmitter 这个项目可以成功播放wav,豆瓣现在停了桌面版API,不知道Po主的fmd项目能更新下手机的API哈

    • 谢谢你提供信息,我有空试试你提到的项目。不过总体来说,用RPi发射FM仍然是一个玩具性质的东西,并无太多实用价值。
      fmd也是别人的项目,我只是拿来用用,不知道豆瓣FM手机版的API有没有公开文档或示例项目?如果有的话,改改应该不会太困难。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据