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

基于Windows Graphics Capture API的C#录屏暂停/续录实现问题

解决Windows Graphics Capture录屏暂停/续录时TranscodeAsync终止的问题

你的问题根源在于暂停时直接销毁_framePool和_session,导致MediaStreamSource失去帧输入源,TranscodeAsync会因没有后续帧而判定录制结束,提前终止转码任务。正确的做法是暂停捕获会话而非销毁对象,同时在帧到达事件中跳过暂停状态下的帧处理,具体修改如下:

1. 修改CaptureFrameWait类的暂停逻辑

不再销毁_framePool和_session,改用CaptureSession的PauseCapture()和StartCapture()方法控制捕获状态:

private bool _paused = false;
private readonly object _lockObj = new object(); // 保证线程安全

public void PauseSession(bool status)
{
    lock (_lockObj)
    {
        _paused = status;
        if (_session != null)
        {
            if (status)
            {
                _session.PauseCapture();
            }
            else
            {
                _session.StartCapture();
            }
        }
    }
}

2. 修改OnFrameArrived事件处理

暂停状态下,获取帧后直接释放,不推送给MediaStreamSource,避免转码流程中断:

private void OnFrameArrived(Direct3D11CaptureFramePool sender, object args)
{
    lock (_lockObj)
    {
        if (_paused)
        {
            // 暂停时仅释放帧资源,不处理
            using (sender.TryGetNextFrame()) { }
            return;
        }
    }

    // 原有的帧处理逻辑,正常推送给MediaStreamSource
    using (var frame = sender.TryGetNextFrame())
    {
        // 此处保留你原有的帧编码、推送逻辑
        // ...
    }
}

3. 关键说明

  • CaptureSession.PauseCapture()会暂停捕获新帧,但不会销毁会话或帧池,MediaStreamSource会保持活跃状态,TranscodeAsync不会因无帧输入而终止。
  • 加锁是为了避免UI线程调用PauseSession和帧处理线程触发OnFrameArrived时的竞态条件,保证状态一致性。
  • 暂停时必须主动释放帧,否则帧池会被占满,导致后续续录时无法获取新帧。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:20:30