如何在树莓派上播放声音 – 启动后无需login

我需要用一个node.js脚本在树莓派上播放声音。 当我从命令行自己启动脚本时,一切正常。 当我启动后运行相同的脚本出/etc/rc.local脚本时,我看到我的运行过程时做“PS辅助”,但我不能听到任何声音。 我也尝试在40秒后启动节点脚本,因为我认为有一些初始化的东西或东西的时间太less,但在这段时间内,我可以从命令行启动脚本,听到声音…

我试了两个用户:root和pi。 他们都从cmd工作(因为自动启动后运行脚本的用户是root用户)

我把我的程序链接到/ usr / bin / node,因为如果不是这个进程不能在启动时启动的话。

我强制raspberryPi使用sereo插孔:amixer cset numid = 3 1

我的node.js代码是:

var fs = require("fs"); var lame = require("lame"); var Speaker = require("speaker"); var SerialPort = require("serialport").SerialPort; var playing = false; var stream = []; stream[0] = "sound1.mp3"; stream[1] = "sound2.mp3"; stream[2] = "sound3.mp3"; stream[3] = "sound4.mp3"; var getCurrentStream = function(){ var i = Math.round( Math.random() * 3) return stream[i]; } var serialPort = new SerialPort("/dev/ttyACM0", { baudrate: 9600 }, false); serialPort.open(function(){ console.log("open"); serialPort.on("data", function(data){ console.log("data received"+data); if(!playing){ try{ var currentStream = fs.createReadStream( getCurrentStream() ); var speaker = new Speaker(); speaker.on('finish', function(){ playing = false; }); currentStream.pipe(new lame.Decoder()).pipe(speaker); playing = true; } catch(e){ console.log("Error: "+e); } } }); }); 

对于启动我试过:作为一个cronjob,后crontab -ei附加:@reboot / opt /节点/ bin /永远启动/var/www/node/residenz/server.js

我也尝试在文件/etc/rc.local里面:/ opt / node / bin / forever start /var/www/node/residenz/server.js

谢谢你的帮助!

以防万一,其他人也有同样的问题我想分享我的最终解决scheme。 我只是做了python的function。 对于启动,我把启动python脚本的行放到文件/etc/rc.local中

 #!/usr/bin/python # -*- coding: utf-8 -*- # # server.py import RPi.GPIO as GPIO import subprocess import time import serial from random import randint port = serial.Serial("/dev/ttyACM0", baudrate=9600, timeout=0) PATH=[4] PATH.append("/var/www/node/Boom1.mp3") PATH.append("/var/www/node/Boom2.mp3") PATH.append("/var/www/node/Boom3.mp3") PATH.append("/var/www/node/Boom4.mp3") def main(): count = 0 while True: value=0 line = port.readlines() if( len(line)!= 0 and count < 4 ): try: job=subprocess.Popen(["mpg321", returnPath()], stdin=subprocess.PIPE) time.sleep( float(line[0])/10 ) except: print("cant play soundfile") def returnPath(): x = randint(1,4) return PATH[x] if __name__ == '__main__': main() 

我有同样的问题,这个问题(和分析答案)给了我希望这是可能的,但对我来说,这是path是一个问题 – 我使用相对path,但工作目录(也许用户? )在cron下执行需要文件的path是绝对的。 顺便说一句,我用cron,python和pygame(pygame.mixer.music),并能够使其工作。

我的testing程序(pygame.mixer.Sound不起作用,但我相信那是因为我使用MP3而不是WAV)

 import pygame import time import os import sys #soundFile = "alarm.mp3" # BAD soundFile = "/home/pi/alarm.mp3" # GOOD channel = None if len(sys.argv) > 1: pygame.mixer.init(44100, -16, 2, 4096) if sys.argv[1] == "music": print "Testing pygame.mixer" pygame.mixer.music.load(soundFile) pygame.mixer.music.set_volume(1.0) pygame.mixer.music.play() elif sys.argv[1] == "sound": print "Testing pygame.sound" pygame.mixer.init() s = pygame.mixer.Sound(soundFile) s.set_volume(1.0) channel = s.play() elif sys.argv[1] == "mpg": print "Using mpg321 Player" os.system("mpg321 " + soundFile) else: print "Using OMX Player" os.system("omxplayer " + soundFile) print "Execution control has returned" while pygame.mixer.get_busy() or pygame.mixer.music.get_busy() or \ (channel is not None and channel.get_busy()): continue pygame.mixer.quit() else: print "Unknown option. Options are omx, mpg, music, or sound" 

在cron中,我有@reboot python /home/pi/soundtest.py music &和启动时播放文件。

Interesting Posts