在一个 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()
|  |      1ruanimal      2020-12-02 14:16:02 +08:00 直接用 subprocess.popen 就好了啊,用啥 multiprocessing 。。。 | 
|      2jkhere      2020-12-02 15:27:49 +08:00 不是很好实现,子进程开始执行后,主进程就无法精确控制子进程了。 假设你子进程开始后,主进程开始计时,到时间后杀死子进程,这样也只是粗略的控制时间。 | 
|  |      3mingl0280      2020-12-02 15:48:26 +08:00 via Android 先开始放音乐,再启动录音,录音返回以后( system 有返回值吧) kill 掉放音…… | 
|  |      4ysc3839      2020-12-02 15:56:21 +08:00 via Android @ruanimal 我也觉得应该直接使用 subprocess.popen 。play_music 就只是调用 shell 启动个新进程,不如直接自己启动新进程,没必要绕一圈。 | 
|      8jkhere      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()) | 
|      9jkhere      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()) ``` |