1

我需要使用 node.js 脚本在树莓派上播放声音。当我自己从命令行启动脚本时,一切都很好。当我从 /etc/rc.local 脚本启动后运行相同的脚本时,我在执行“ps aux”时看到了我的运行进程,但我听不到任何声音。我也尝试在 40 秒后启动节点脚本,因为我认为一些初始化东西或其他东西的时间太少了,但在这段时间内我可以从命令行启动脚本并听到声音......

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

我将我的程序链接到 /usr/bin/node 因为如果不是,该进程无法在启动时启动。

我强迫树莓派使用立体声插孔: 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/node/bin/forever start /var/www/node/residenz/server.js

我也在文件 /etc/rc.local 中尝试了相同的方法: /opt/node/bin/forever start /var/www/node/residenz/server.js

谢谢你的帮助!

4

2 回答 2

1

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

我的测试程序(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 &并且它在启动时播放文件。

于 2016-04-09T21:38:46.973 回答
0

以防万一,其他人有同样的问题我想分享我的最终解决方案。我只是用python完成了这个功能。对于启动,我将启动 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()
于 2014-09-18T10:54:30.600 回答