C# 调用 ffmpeg 录制流,手动关闭遇到问题需要大佬帮助

2021-09-14 14:13:30 +08:00
 yuhangch

环境 .net 4.5

需求是这样,设计两个 rest 请求,一个启动录制(调用 ffmpeg ),一个停止录制(找到 ffmpeg 进程关掉它):

    const string ffmpegPath = "/ffmpeg.exe";
    var output = @"c:/···/a.mp4";
    var url =  ···; 
    var cmdStr = $@"-i ""{url}"" {output} -y";

    var startInfo = new ProcessStartInfo
    {
        FileName = ffmpegPath,
        Arguments = cmdStr,
        // UseShellExecute = false,
        // RedirectStandardInput = true,
        WindowStyle = ProcessWindowStyle.Minimized
    };



    var rp = Process.Start(startInfo);

情况是这样的,使用 terminal 启动 ffmpeg 来录制视频流时,ctrl+c、手动关闭窗口,视频文件是完整的,但直接关闭进程视频文件就损坏了。

也就是说Process.Kill() 直接关闭进程不能用。

手动关闭窗口倒是可以,在 startInfo 里:

  UseShellExecute = true
    
    ···
    
    //之后调用
  Process.CloseMainWindow()

但这种方式会弹出一个 cmd 窗口,即使把它调成最小化,还是感觉不太能用。

那么如果想要在UseShellExecute = false的情况下,模拟关闭窗口或者模拟ctrl+c命令要怎么做?

请彦祖们指点!

1525 次点击
所在节点    C#
2 条回复
jifengg
2021-09-14 14:33:30 +08:00
ffmpeg cli 有一个快捷键“q“,用于退出。获取 ffmpeg process 的 stdin,往里 write 一个"q"试试。
其次,ctrl+c 是发送一个 SIGINT 信号,可以看看 win sdk ( C#太久没用忘记了),模拟发送一个信号。
tux
2021-09-14 19:39:16 +08:00
录制模式好像是有参数,专门解决这个问题 类似这样 请参考 --hls-prefer-ffmpeg --hls-use-mpegts

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/801746

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX