存储流的最新 N MB?

存储流的最新 N MB?

我目前使用 wget 或 curl 来下载连续的 AAC 流。我想将磁盘上存储的内容限制为最新的 N MB。换句话说,某种大小有限的 FIFO 缓冲区(我猜?)。有什么想法如何实现这一点?这是 OS X/BSD。

目的是能够在发生有趣的事情时停止流,然后将最后几分钟从中提取到永久存储中。

更新:另一种解决方案是每 N MB 中断一次并启动一个新的本地文件并轮换出先前的文件(即使用序列号、时间戳或类似内容对其进行重命名)。但是,如果这样做,文件之间需要有大量重叠。

答案1

这是一个简单的 python 脚本,可能会有所帮助。它只是从 stdin 读取并写入 stdout,但将最后 N 个字节保留在内存中。如果您使用 control-C (SIGINT) 中断它,它会将内存转储到文件中/tmp/sample001并继续。

#!/usr/bin/python3
# circular buffer in memory without recopy using bytearray
# https://unix.stackexchange.com/a/401875/119298
import sys, os

def copy():
    def dump(fd,v):
        fd.write(v)

    space = 10000000
    buffer = bytearray(space) # all zero bytes
    view = memoryview(buffer)
    head = 0; wrapped = False
    sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0)
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
    fileno = 1
    while True:
        try:
            nbytes = sys.stdin.readinto(view[head:])
            if nbytes==0: 
                break # eof
            sys.stdout.write(view[head:head+nbytes].tobytes())
            head += nbytes
            if head>=space:
                head = 0; wrapped = True
        except KeyboardInterrupt:
            filename = "/tmp/sample%03d" % fileno
            fileno += 1
            with open(filename,"wb") as fd:
                if wrapped:
                    dump(fd, view[head:])
                if head:
                    dump(fd, view[0:head])

copy()

如果您没有 python3,则需要对 python 2.7 进行一些更改。您可能需要担心如何保留合法的 AAC 帧格式,但也许如果您首先尝试,您可能会发现您正在使用的任何内容都可以从任意偏移数据进行自同步。

相关内容