想用床头的收音机收听豆瓣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左右长的杜邦线做天线,广播范围和信号强度就会大大提高了。
目前这个豆瓣FM广播台还有两个大问题需要解决:
- 立体声调频广播:现在实现的版本是单声道的,理论上应该也可以把音频调制成立体声的。这需要一些我所不具备的调频广播的知识,待我有空再钻研钻研。
- CPU占用率:现在的版本在做调制和发射时,对CPU的占用率比较高。如果Raspberry Pi正在忙于做别的事情的话,你可能会听到一些杂音或者是唱机/磁带机没电了的时候的音响效果。
其实吧,这样收听豆瓣FM可真是多此一举。直接把耳机插在Raspberry的耳机插孔用fmd播放不就完事了么……天行健,君子以折腾不息!
./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.*看看。
新的问题又来了,我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设置在哪?
rate的设置在fmd.conf中,请参考GitHub上的文档。
你好
我在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版本不兼容?
我也猜的是这个原因,准备装一个debian在virtualbox里面试试
解决了,犯了低级错误,channel id写错了,改成0 私人兆赫就正常了
赞!
不错,赞一个!
你好
我编译成功了
但是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]段中的那些值重新获取一遍改一下试试看。
我在虚拟机里面放音乐是可以听到的
你好
我试过这个,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中多加一些调试信息打出来看看是什么原因了。
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
我把fmd.conf里面等号两边的空格都去掉,现在可以了。
运行fmc play可以看到在播放一个歌曲,但是现在没有声音。
我需要做什么其他的吗
谢谢
我看了一下代码,配置文件中是允许等号两边有空格的,我自己机器上的也都是有空格的……
我搞定了!!!
重启了一下(第一次重启)
有声音了
非常感谢你的耐心指教!!!
祝贺一下!
8客气~
大哥你太神了
:-)
我在学习着你这个实验,但是libjson0-dev 这个包我们找不到,上网找了好多个都说跟系统版本不对,求帮助T~T
你们用的是什么系统呢?是Raspbian吗?别的系统中包名可能不一样。
如果是Raspbian的话,有没有先apt-get update一下后再apt-get install试试?
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的包安装,这也是可行的。
不是加-f,是单独执行sudo apt-get install -f。
感觉我知道问题关键了,要先把 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应该是可以解决的。
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之后为什么会是这错误 求助啊啊啊
少libcurl的开发包,libcurl4-openssl-dev装好了吗?
嗯嗯 是的忘记装了。。我make好了之后
root@raspberrypi:/home/pi/fmdd# ./fmd
root@raspberrypi:/home/pi/fmdd#
没有反应啊。。
请参考fmd的使用说明,做相关的配置等。fmd正常运行时就是在后台的,需要用fmc或telnet来操作它,请参考fmd项目的说明。
你可以先用alsa设备用本地音频输出调试到没问题了再改成FM发射。
请记住用FM发射的话需要root权限,配置文件也会跑到/root下,请参考本文正文中的说明。
唉 不会弄这个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所在的目录,然后再编译就可以了。
libsjoin-c.so的目录在哪?用-L参数指定的格式是怎样的?
似乎在新版的Raspbian中libjson-c的打包方式跟文中所说的已经有所出入。具体的因为暂时手头没有RPi无法验证,请自行调整一下依赖库。
-L后面是直接跟.so所在的目录就可以了。
我的依赖包搞好了~但是又说我空间不足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到指定的目录上来扩展空间。
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,看是哪一步的问题。
如果site config是用文件配置的,同时支持读取GPIO切换台就完美了
这些都不难实现,有兴趣可以试试。
http://www.freemindworld.com/blog/2013/130316_raspberry_pi_with_remote_control.shtml
这篇文章里涉及的代码中有支持红外遥控换歌的,要换台也可以参考实现一下,用起来比GPIO接按钮更方便。
请问在ubuntu上链接错误:
player.c:(.text+0x486): undefined reference to `mpg123_encsize’
是怎么回事?
我猜是libmpg123库没安装或者版本不匹配吧,另外看看Makefile里有没有-l这个库。
问题解决了,缺省安装的是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
我用xbian的apt安装libcurl4时出现Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/c/curl/libcurl4-openssl-dev_7.26.0-1+wheezy3_armhf.deb 404 Not Found
我看了
http://mirrordirector.raspbian.org/raspbian/pool/main/c/curl/,那个wheezy3_armhf.deb被更新成wheezy4_armhf.deb了,咋整呢
我现在是把apt源改成http://blog.csdn.net/spaceship20008/article/details/8458221这样然后sudo apt-get update就可以了,直接sudo apt-get update不知道行不行
直接sudo apt-get update就行了。
您一开始遇到的问题在于软件源中的版本已经更新,但本地的软件目录中没更新。apt-get update就是用来更新本地软件目录的。
Pingback引用通告: FMD–A DoubanFM Server(1) | Miibotree's Thinking
Pingback引用通告: FM Transmitter Lib – A DoubanFM Server(2) | Miibotree's Thinking
谢谢作者的博客,按照您的博客来终于成功实现了!还有上次在图书馆见到你翻译的新书才萌发出玩Raspberry的想法,总之您应该算是我的启蒙老师啦。十分感谢~~~
祝贺实验成功。我的文章和翻译的书能对你有所帮助,深感荣幸。
fmd的文件好像改过了,看github上的说明不知所云。不知道怎么编译,请指教==
请说明具体的问题,遇到了什么样的错误无法解决?
运行fmc play 和 fmd play 均出现下面的错误,make release 成功了
-bash: fmc: command not found
你漏了./吧?
在Bash中,默认不会把当前目录加在PATH中。所以,执行当前目录下的程序时,需要明确指定路径。比如:./fmc play
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
root@raspberrypi:~# cat .fmd/fmd.err
Open audio output: No such file or directory
mplayer 播放mp3文件声音正常,不知是哪里出错了
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具体的调试方法就没办法在这里展开描述了,抱歉。
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均是如此的结果,一直卡在这里无法进行了
此外 ./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}
你好,请问在cmd或者python os.system中如何给telnet localhost 10098 输入play stop 等命令呢,谢谢
建议您把那个fmc工具编译出来使用,这样就可以直接调用fmc -a 127.0.0.1 -p 10098 play之类的了。
https://github.com/hzqtc/fmc
两个问题:
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。
Pingback引用通告: 极客以折腾不息的树莓派玩法 – CrackPi.Com 精通树莓派,香蕉派,各种卡片式电脑!
pifm好像不支持pi3,不过用https://github.com/markondej/fm_transmitter 这个项目可以成功播放wav,豆瓣现在停了桌面版API,不知道Po主的fmd项目能更新下手机的API哈
谢谢你提供信息,我有空试试你提到的项目。不过总体来说,用RPi发射FM仍然是一个玩具性质的东西,并无太多实用价值。
fmd也是别人的项目,我只是拿来用用,不知道豆瓣FM手机版的API有没有公开文档或示例项目?如果有的话,改改应该不会太困难。