Raspberry Pi 和 Mplayer 声音循环错误

Posted

技术标签:

【中文标题】Raspberry Pi 和 Mplayer 声音循环错误【英文标题】:Raspberry Pi and Mplayer sound loop error 【发布时间】:2014-03-10 18:37:17 【问题描述】:

我正在尝试使用mplayer 循环播放 1 秒的声音。当我运行代码时,它会使覆盆子操作系统崩溃。我注意到有时mplayer 进程的多个实例挂在任务管理器中,因此我添加了代码来获取进程ID pidofkill。 但是该过程不断出现多次,并且覆盆子在一些循环后不断崩溃。

此外,有时声音似乎重叠(可能是因为进程的多个实例)

import os
import time
import serial

# arduino stuff
ser = serial.Serial('/dev/ttyACM0', 9600)

while True:
    os.system('mplayer -really-quiet /home/pi/Desktop/sound.mp3 &')
    time.sleep(1.5)
    ser.write('1') # send a signal to arduino 
    a = os.popen('pidof mplayer').read()
    if(a != ''):
        os.system('sudo kill ' + str(a))

注意:我试过用其他播放器,比如mpg123,但问题完全一样。

【问题讨论】:

您是否在 Arduino 崩溃前得到 IO 响应? 我尝试删除 arduino/串行通信代码,覆盆子不再崩溃,声音效果很好。但是如果我做任何其他事情(甚至拖动窗口),树莓派会变得非常慢,并且声音再次开始失败。 【参考方案1】:

如果你的声音文件的时间长于你的睡眠时间 1.5 秒,那么很自然地就会建立无数的进程,因为你在后台运行 mplayer,从尾随的 '& 可以看出'。

杀死进程有点小技巧。它引入了一个问题,即您使用 os.popen() 打开一个您永远不会关闭的类似文件的对象。

您应该将声音文件修剪到您想要播放的长度,并删除命令行末尾的“&”。作为修剪声音文件的替代方法,您可以找到一个 mplayer 选项来限制它播放曲调的时间。

【讨论】:

我删除了&sleep 并且性能更好,但几分钟后它又崩溃了。树莓派怎么会因为一个声音循环和一些 arduino 串行通信而崩溃? 查看我的最新编辑。您是否也删除了 popen,或者至少关闭了它打开的文件对象。 是的,我删除了所有内容,并且看起来声音正常工作。也许问题出在我开始串行通信时? 还尝试了单独脚本中的 arduino 通信,它也可以正常工作。只有当两者同时执行时应用才会崩溃。

以上是关于Raspberry Pi 和 Mplayer 声音循环错误的主要内容,如果未能解决你的问题,请参考以下文章

Raspberry Pi:检测声音并触发网络摄像头 [关闭]

MediaPlayer无法在Android Things Raspberry Pi 3上运行

Raspberry Pi NoIR 相机挂起

用Raspberry Pi搭建Azure IOT解决方案

Raspberry pi 上的 Alsa 问题

从 Raspberry Pi 上的麦克风读取频率