Raspberry Pi 和 Mplayer 声音循环错误
Posted
技术标签:
【中文标题】Raspberry Pi 和 Mplayer 声音循环错误【英文标题】:Raspberry Pi and Mplayer sound loop error 【发布时间】:2014-03-10 18:37:17 【问题描述】:我正在尝试使用mplayer
循环播放 1 秒的声音。当我运行代码时,它会使覆盆子操作系统崩溃。我注意到有时mplayer
进程的多个实例挂在任务管理器中,因此我添加了代码来获取进程ID pidof
和kill
。
但是该过程不断出现多次,并且覆盆子在一些循环后不断崩溃。
此外,有时声音似乎重叠(可能是因为进程的多个实例)
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:检测声音并触发网络摄像头 [关闭]