ストリームの最新のNMBを保存しますか?

ストリームの最新のNMBを保存しますか?

現在、連続AACストリームをダウンロードするためにwgetまたはカールを使用しています。ディスクに保存される内容を最新のNMBに制限したいです。つまり、限られたサイズの一種のFIFOバッファです。これを達成する方法についてのアイデアはありますか?これはOS X / BSDです。

目的は、興味深いことが発生した場合はストリームを停止し、最後の数分を永続ストアに抽出することです。

更新:別の解決策は、NMBごとに中断し、新しいローカルファイルを起動してから古いファイルを置き換えることです(たとえば、シリアル番号、タイムスタンプ、または同様の名前に名前を変更するなど)。ただし、これを行うと、ファイル間で重複が発生するはずです。

ベストアンサー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フレームフォーマットを維持することを心配する必要があるかもしれませんが、最初に試してみると、使用中のすべてが任意のオフセットデータで自己同期できることがわかります。

おすすめ記事