![像 ShadowPlay 一样在 ffmpeg 中限制音频缓冲区的大小](https://linux22.com/image/1556024/%E5%83%8F%20ShadowPlay%20%E4%B8%80%E6%A0%B7%E5%9C%A8%20ffmpeg%20%E4%B8%AD%E9%99%90%E5%88%B6%E9%9F%B3%E9%A2%91%E7%BC%93%E5%86%B2%E5%8C%BA%E7%9A%84%E5%A4%A7%E5%B0%8F.png)
我正在尝试设置一个类似于 Nvidia ShadowPlay 的音频捕获系统,其中有一个后台程序,它不断保存最后 X 分钟的镜头(或在这种情况下为音频)的缓冲区,并在命令下将其永久保存到单独的文件中。到目前为止,我想到的是:
ffmpeg -f dshow -i audio="My input device" buffer.wav
录制,然后
ffmpeg.exe -sseof -30 -i buffer.wav -c copy capture.wav
复制缓冲区的最后 30 秒。但是,这会带来缓冲区文件在几分钟内达到数百兆字节的问题。我希望能够调整录音的最大长度,这样一旦超过此限制,它就会开始在文件开头截断。换句话说,如果文件的限制为 5 分钟,并且已经录制了 5 分 10 秒,则应删除录制的前 10 秒,从而确保文件时长不超过 5 分钟。
答案1
您可以使用段复用器。
ffmpeg -f dshow -i audio="My input device" -af aresample=async=1 -f segment -segment_time 30 -segment_wrap 2 buffer%d.wav
这将首先创建buffer0.wav
。一旦有 30 秒,它将写入buffer1.wav
直到该文件有 30 秒。
一旦缓冲区 1 填满,它将再次将接下来的 30 秒数据写入缓冲区 0。因此,在录制的第一个 30 秒之后的任何时间,您将拥有至少 30 秒、最多 60 秒的数据。
只需按照时间升序对文件进行排序Last modified
,然后使用其连接数据中的最后 30 秒的数据。