鱼C论坛

 找回密码
 立即注册
查看: 85|回复: 3

非AI请进--当我在 Python 中调用 OBS 的热键停止录制时,视频会丢失最后一部分(大...

[复制链接]
发表于 前天 12:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
当我在 Python 中调用 OBS 的hotkeys停止录制时(或者直接kill时),视频都会丢失最后一部分(大约 3 秒)。如果我在 OBS 的 GUI 上停止录制,则没有问题。这是什么问题?

我能用 Python 停止录制(hotkeys or kill)而不丢失最后一部分吗?(不要用delay的方法,因为这种方法可能又会多录制几秒)(我没有使用 WebSocket,因为它又会弹出1次访问端口的警告窗口)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 12:45 | 显示全部楼层
您好!您遇到的问题是因为当通过热键或kill命令停止录制时,OBS可能没有足够的时间刷新视频缓冲区,导致最后几秒数据丢失。而通过GUI停止时,OBS会安全地完成写入操作。以下是一些解决方案,避免使用delay或WebSocket。

解决方案1:使用OBS命令行参数停止录制
如果OBS支持通过命令行控制运行中的实例,这是一种安全的方法。请尝试在Python中使用subprocess调用OBS的停止录制命令。


  1. import subprocess
  2. subprocess.run(["obs64.exe", "--stoprecording"])  # 请根据您的OBS可执行文件路径调整
复制代码


注意:这种方法可能取决于OBS版本和配置。如果命令行参数无效,请尝试方案2。

解决方案2:模拟热键后等待视频文件解锁
通过模拟热键停止录制,然后监控视频文件是否解锁(表示OBS已完成写入)。这避免了固定延迟,而是基于实际事件等待。

首先,安装所需库(如果尚未安装):
pip install psutilpip install pyautogui

然后使用以下代码:


  1. import os
  2. import time
  3. import pyautogui  # 用于模拟热键

  4. def is_file_locked(filepath):
  5.     try:
  6.         with open(filepath, 'a'):  # 尝试以追加模式打开文件
  7.             return False
  8.     except PermissionError:  # 文件被锁定时会抛出权限错误
  9.         return True
  10.     except Exception as e:
  11.         print(f"错误: {e}")
  12.         return True  # 保守处理,假设文件仍被锁定

  13. # 设置视频文件路径(请替换为您的实际路径)
  14. video_file = "C:/Users/YourName/Videos/obs_video.mp4"  # 示例路径,请修改

  15. # 发送停止录制热键(假设您的OBS热键是Ctrl+F10,请根据实际情况调整)
  16. pyautogui.hotkey('ctrl', 'f10')

  17. # 等待文件解锁,轮询间隔0.1秒
  18. max_wait_time = 10  # 最大等待时间(秒),避免无限循环
  19. start_time = time.time()
  20. while is_file_locked(video_file):
  21.     if time.time() - start_time > max_wait_time:
  22.         print("等待超时,文件可能仍被锁定")
  23.         break
  24.     time.sleep(0.1)  # 短时间等待,减少不必要的延迟

  25. print("录制已安全停止")
复制代码


说明:
- 这段代码先模拟热键停止录制,然后检查视频文件是否被OBS锁定。
- 一旦文件解锁,说明OBS已完成写入,循环退出。
- 轮询间隔为0.1秒,不会显著增加录制时间。

注意事项:
- 请确保视频文件路径正确。您可以在OBS的设置中找到录制输出路径。
- 如果OBS使用临时文件或重命名机制,可能需要调整文件路径逻辑。
- 如果热键无效,请检查OBS的热键设置并调整代码中的按键组合。

如果以上方法仍无效,可能是OBS版本或系统特定问题。建议检查OBS日志或更新OBS到最新版本。希望这能帮助您解决问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 13:30 | 显示全部楼层
FishC 发表于 2025-9-26 12:45
您好!您遇到的问题是因为当通过热键或kill命令停止录制时,OBS可能没有足够的时间刷新视频缓冲区,导致最 ...

1.如果obs最小化了,模拟按键 的方法还有用吗?
2.这个代码跟调用obs的hotkeys有啥区别?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 13:30 | 显示全部楼层
blackantt 发表于 2025-09-26 13:30
FishC 发表于 2025-9-26 12:45
您好!您遇到的问题是 ...


您好!感谢您的追问。我来逐一解答您的疑问。

问题1:如果OBS最小化了,模拟按键的方法还有用吗?
是的,模拟按键(如使用pyautogui)通常是系统级别的热键,只要OBS在运行(即使最小化),热键应该能触发。因为OBS的热键是全局注册的,不依赖于窗口焦点。但请注意,极少数情况下,如果系统或OBS设置限制了后台热键,可能无效。建议先测试一下热键在OBS最小化时是否正常工作。

问题2:这个代码跟调用OBS的hotkeys有啥区别?
您之前直接调用OBS热键(如通过脚本发送热键信号)和我的代码都模拟了热键,但关键区别在于:
- 您的原始方法:只发送热键,然后立即结束,可能未等待OBS完成视频写入。
- 我的代码:在发送热键后,添加了等待文件解锁的步骤。这通过检查视频文件是否被OBS锁定来确保录制完全停止,避免数据丢失。本质上,这是一种安全退出机制,而不是单纯依赖热键。

简单说,我的代码解决了热键触发后OBS缓冲区刷新的问题,而您的原始方法没有处理这一步。

如果您想进一步优化,可以尝试结合OBS的命令行参数(如果支持),但模拟热键+文件监控是目前最实用的方法。希望这能澄清您的疑惑!如果还有其他问题,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-28 05:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表