gpt4 book ai didi

python - 使用 ffmpeg 控制网络摄像头视频捕获到文件的缓冲区大小

转载 作者:行者123 更新时间:2023-12-04 22:54:13 25 4
gpt4 key购买 nike

在 Python 脚本中,我想捕获网络摄像头流并将其保存到本地硬盘上的视频文件中,但我想编写脚本来确定视频的生命周期。为此,我使用 python-ffmpeg库,它本质上是一个简单的 Python SDK,在子进程中围绕 ffmpeg。
这是我目前的剪辑:

from time import sleep
import ffmpeg


APPLICATION = "ffmpeg.exe"
CAMERA_NAME = "Sandberg USB Webcam Pro"

stream = ffmpeg.input(f"video={CAMERA_NAME}", format="dshow")
stream = ffmpeg.output(stream, "output.mkv", preset="medium", c="copy")

if __name__ == "__main__":
process = ffmpeg.run_async(stream, cmd=APPLICATION, overwrite_output=True, quiet=True)
_ = input("Press enter when finished.")
print("Shutting down in 3 seconds..")
sleep(3)
process.terminate()
这工作正常。然而, process.terminate() 非常突然,因为它本质上只是立即终止子进程。我已经看到这往往会切断几秒钟的视频流。我认为它是连续写入的,当被杀死时,已经写入的内容仍然存在。
现在我无法控制(缓冲区的持续时间?)。我只是猜测它大约是 3 秒,因此我的 sleep 电话。有没有办法将其配置为 ffmpeg?

最佳答案

我们必须优雅地关闭 FFmpeg,而不是试图控制缓冲区大小。
为了优雅地关闭FFmpeg,我们可以写'q'stdin管道,如 this post 中所述.
当我们开始录制时,会出现以下消息:Press [q] to stop, [?] for help .
写作 'q'stdin模拟按下 q key 。

  • 使用 pipe_stdin=True 打开 FFmpeg 子进程:
     process = ffmpeg.run_async(stream, cmd=APPLICATION, pipe_stdin=True, overwrite_output=True, quiet=True)
  • 'q'encode("GBK") 的信(带 stdin)管道和“communicate()”:
     process.stdin.write('q'.encode("GBK"))
    process.communicate()
  • 等待 FFmpeg 子进程结束:
     process.wait()

  • 代码示例:
    from time import sleep
    import ffmpeg
    import signal

    APPLICATION = "ffmpeg.exe"
    CAMERA_NAME = "Sandberg USB Webcam Pro"

    stream = ffmpeg.input(f"video={CAMERA_NAME}", format="dshow")
    stream = ffmpeg.output(stream, "output.mkv", preset="medium", c="copy")

    if __name__ == "__main__":
    process = ffmpeg.run_async(stream, cmd=APPLICATION, pipe_stdin=True, overwrite_output=True, quiet=True)
    _ = input("Press enter when finished.")
    #sleep(10) # Record 10 seconds for testing
    process.stdin.write('q'.encode("GBK"))
    process.communicate()
    process.wait()
    当我使用 sleep(10)而不是 _ = input ,录制的视频时长约为 9 秒。
    我认为它记录了 9 秒而不是 10 秒,因为 FFmpeg 需要大约一秒才能加载并开始执行。

    设置实时缓冲区为 100M , 和 fflags="nobuffer"没有效果。 rtbufsize="100M" :
    stream = ffmpeg.input(f"video={CAMERA_NAME}", rtbufsize="100M", format="dshow")
    fflags="nobuffer":
    stream = ffmpeg.input(f"video={CAMERA_NAME}", fflags="nobuffer", format="dshow")
    看起来 FFmpeg 在我们写 'q' 时会刷新缓冲区,没有数据丢失,缓冲区大小没有影响。

    关于python - 使用 ffmpeg 控制网络摄像头视频捕获到文件的缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71456517/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com