在一个 linux 主机上,我想同时开始播放音乐和录音(有麦克风),期望录音结束,音乐自动停止。 现在只需要录音 20 秒,下面的代码录音结束后,音乐不会停止,怎么写可以实现目的呢
# coding:utf-8
from multiprocessing import Process as process
import os
def play_music():
cmd1 = "aplay muisc.wav"
os.system(cmd1)
def record():
cmd1 = "arecord -r 16000 -t wav -d 20 -v out.wav"
os.system(cmd1)
if __name__ == '__main__':
p1 = process(target=play_music)
p1.daemon=True
p1.start()
record()
p1.terminate()
p1.join()
1
ruanimal 2020-12-02 14:16:02 +08:00
直接用 subprocess.popen 就好了啊,用啥 multiprocessing 。。。
|
2
jkhere 2020-12-02 15:27:49 +08:00
不是很好实现,子进程开始执行后,主进程就无法精确控制子进程了。
假设你子进程开始后,主进程开始计时,到时间后杀死子进程,这样也只是粗略的控制时间。 |
3
mingl0280 2020-12-02 15:48:26 +08:00 via Android
先开始放音乐,再启动录音,录音返回以后( system 有返回值吧) kill 掉放音……
|
4
ysc3839 2020-12-02 15:56:21 +08:00 via Android
@ruanimal 我也觉得应该直接使用 subprocess.popen 。play_music 就只是调用 shell 启动个新进程,不如直接自己启动新进程,没必要绕一圈。
|
8
jkhere 2020-12-04 17:31:15 +08:00
给你个 demo,用 python 的协程吧:
import asyncio async def eternity(): # do your job while True: print('doing!') async def main(): # Wait for at most 20 second try: await asyncio.wait_for(eternity(), timeout=20.0) except asyncio.TimeoutError: print('timeout! job done') asyncio.run(main()) |
9
jkhere 2020-12-04 17:32:38 +08:00
```python
import asyncio async def eternity(): # do your job while True: print('doing!') async def main(): # Wait for at most 20 second try: await asyncio.wait_for(eternity(), timeout=20.0) except asyncio.TimeoutError: print('timeout! job done') asyncio.run(main()) ``` |