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