树莓派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文件进程
额外注意事项
- 保持proc变量为全局(你已经调整为全局了,之前局部变量的问题是进程启动后被GC回收,导致后续无法控制)
- 可以给proc绑定
Exited事件,当播放器自动结束时把proc设为null,避免后续操作触发空引用 - 树莓派上的Mono版本尽量新一些,旧版本可能在Process的标准输入重定向上有兼容性问题
内容的提问来源于stack exchange,提问作者Greywolf
相关产品推荐
相关产品推荐

