Linux环境下Swift调用C函数播放音频后进程无法返回问题求助
解决Swift调用cvlc播放音频后进程无法返回的问题
问题原因
cvlc默认播放完成后不会自动退出,会进入交互等待状态,导致system()函数一直阻塞等待进程结束,进而卡住Swift主线程,必须手动按Control-C才能终止进程。
快速解决方案
给cvlc命令添加--play-and-exit和--no-interact参数,让VLC播放完音频后立即退出,且不进入交互模式:
修改原代码中的system调用行:
system("cvlc audiofile.m4a --play-and-exit --no-interact")
完整修改后的代码
import Glibc // SwiftyGPIO 初始化代码... while(true){ if sensor.value == 0 { print("No Motion") } else { print("play music!") // 添加参数让VLC播放后自动退出 system("cvlc audiofile.m4a --play-and-exit --no-interact") } usleep(100000) }
更Swifty的替代方案:使用Swift的Process类
比起调用C的system()函数,用Swift标准库的Process类能更灵活地控制外部进程,还能捕获错误信息:
import Foundation import Glibc // SwiftyGPIO 初始化代码... while(true){ if sensor.value == 0 { print("No Motion") } else { print("play music!") let vlcProcess = Process() // 指定cvlc的路径(树莓派上通常是/usr/bin/cvlc) vlcProcess.executableURL = URL(fileURLWithPath: "/usr/bin/cvlc") // 传入播放参数 vlcProcess.arguments = ["audiofile.m4a", "--play-and-exit", "--no-interact"] do { try vlcProcess.run() // 等待播放进程结束 vlcProcess.waitUntilExit() } catch { print("启动VLC失败:\(error.localizedDescription)") } } usleep(100000) }
参数说明
--play-and-exit:强制VLC在媒体播放完毕后立即退出进程--no-interact:禁用所有交互界面,避免进程等待用户输入
内容的提问来源于stack exchange,提问作者Brendan M
相关产品推荐
相关产品推荐

