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

树莓派C#程序控制omxplayer时点击按钮进程意外退出求助

解决Omxplayer通过C# Mono控制时暂停指令无效的问题

我明白你现在的困扰——在终端里手动操作omxplayer一切正常,但用WinForms的SendKeys发送暂停指令时,进程直接退出。这问题的核心原因其实很简单:SendKeys根本没把按键发送到omxplayer进程里。

为什么SendKeys不行?

SendKeys是针对当前系统的活动窗口发送按键的,但你启动omxplayer时设置了CreateNoWindow = true,它没有可视化窗口;再加上你是通过SSH远程测试,你的WinForms程序的活动窗口和omxplayer的进程完全不关联。最后你还在命令行加了&让进程后台运行,这直接让omxplayer脱离了你的程序控制,所以发送的按键完全没到点子上。

正确的做法是:omxplayer是通过**标准输入(Standard Input)**接收控制指令的,我们需要把程序的输入流和omxplayer的进程绑定,直接往里面写控制字符。

修改后的代码实现

首先调整启动omxplayer的代码,开启标准输入重定向,去掉后台运行的&:

namespace WindowsFormsApp1 {
 public partial class Form1 : Form {
 ProcessStartInfo procStartInfo;
 System.Diagnostics.Process proc;
 public Form1() {
 InitializeComponent();
 // 初始化进程变量,避免空引用
 proc = null;
 }
 private void button1_Click(object sender, EventArgs e) {
 textBox1.Text = "Button Clicked";
 // 去掉命令末尾的&,不要让进程后台运行
 procStartInfo = new ProcessStartInfo("omxplayer", "/home/pi/Music/Debug/Mutter.mp3");
 procStartInfo.RedirectStandardOutput = true;
 procStartInfo.RedirectStandardInput = true; // 关键:开启标准输入重定向
 procStartInfo.UseShellExecute = false;
 procStartInfo.CreateNoWindow = true;
 // 如果之前有进程在运行,先停止它
 if (proc != null && !proc.HasExited) {
    proc.StandardInput.Write("q");
    proc.WaitForExit();
 }
 proc = new System.Diagnostics.Process();
 proc.StartInfo = procStartInfo;
 proc.Start();
 }
 private void button2_Click(object sender, EventArgs e) {
 // 退出前先停止播放器
 if (proc != null && !proc.HasExited) {
    proc.StandardInput.Write("q");
    proc.WaitForExit();
 }
 Close();
 }
 private void button3_Click(object sender, EventArgs e) {
 // 先判断进程是否存活,避免空引用错误
 if (proc != null && !proc.HasExited) {
    proc.StandardInput.Write("p"); // 直接往标准输入写暂停指令
    proc.StandardInput.Flush(); // 确保指令被发送
 }
 }
 }
}

扩展其他控制功能

omxplayer支持的控制指令都是单字符或转义序列,你可以直接扩展按钮功能:

  • 停止播放:发送"q"字符(和关闭窗口前的处理逻辑一致)
  • 快进30秒:发送"\x1b[C"(右箭头的ANSI转义序列)
  • 后退30秒:发送"\x1b[D"(左箭头的ANSI转义序列)
  • 切换下一首:先发送"q"停止当前播放,再启动新的MP3文件进程

额外注意事项

  1. 保持proc变量为全局(你已经调整为全局了,之前局部变量的问题是进程启动后被GC回收,导致后续无法控制)
  2. 可以给proc绑定Exited事件,当播放器自动结束时把proc设为null,避免后续操作触发空引用
  3. 树莓派上的Mono版本尽量新一些,旧版本可能在Process的标准输入重定向上有兼容性问题

内容的提问来源于stack exchange,提问作者Greywolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:54:06