You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:21:10