|
您好!您遇到的问题是因为当通过热键或kill命令停止录制时,OBS可能没有足够的时间刷新视频缓冲区,导致最后几秒数据丢失。而通过GUI停止时,OBS会安全地完成写入操作。以下是一些解决方案,避免使用delay或WebSocket。
解决方案1:使用OBS命令行参数停止录制
如果OBS支持通过命令行控制运行中的实例,这是一种安全的方法。请尝试在Python中使用subprocess调用OBS的停止录制命令。
- import subprocess
- subprocess.run(["obs64.exe", "--stoprecording"]) # 请根据您的OBS可执行文件路径调整
复制代码
注意:这种方法可能取决于OBS版本和配置。如果命令行参数无效,请尝试方案2。
解决方案2:模拟热键后等待视频文件解锁
通过模拟热键停止录制,然后监控视频文件是否解锁(表示OBS已完成写入)。这避免了固定延迟,而是基于实际事件等待。
首先,安装所需库(如果尚未安装):
pip install psutil 或 pip install pyautogui
然后使用以下代码:
- import os
- import time
- import pyautogui # 用于模拟热键
- def is_file_locked(filepath):
- try:
- with open(filepath, 'a'): # 尝试以追加模式打开文件
- return False
- except PermissionError: # 文件被锁定时会抛出权限错误
- return True
- except Exception as e:
- print(f"错误: {e}")
- return True # 保守处理,假设文件仍被锁定
- # 设置视频文件路径(请替换为您的实际路径)
- video_file = "C:/Users/YourName/Videos/obs_video.mp4" # 示例路径,请修改
- # 发送停止录制热键(假设您的OBS热键是Ctrl+F10,请根据实际情况调整)
- pyautogui.hotkey('ctrl', 'f10')
- # 等待文件解锁,轮询间隔0.1秒
- max_wait_time = 10 # 最大等待时间(秒),避免无限循环
- start_time = time.time()
- while is_file_locked(video_file):
- if time.time() - start_time > max_wait_time:
- print("等待超时,文件可能仍被锁定")
- break
- time.sleep(0.1) # 短时间等待,减少不必要的延迟
- print("录制已安全停止")
复制代码
说明:
- 这段代码先模拟热键停止录制,然后检查视频文件是否被OBS锁定。
- 一旦文件解锁,说明OBS已完成写入,循环退出。
- 轮询间隔为0.1秒,不会显著增加录制时间。
注意事项:
- 请确保视频文件路径正确。您可以在OBS的设置中找到录制输出路径。
- 如果OBS使用临时文件或重命名机制,可能需要调整文件路径逻辑。
- 如果热键无效,请检查OBS的热键设置并调整代码中的按键组合。
如果以上方法仍无效,可能是OBS版本或系统特定问题。建议检查OBS日志或更新OBS到最新版本。希望这能帮助您解决问题!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|