현재 연속 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 프레임 형식을 유지하는 것에 대해 걱정해야 할 수도 있지만 먼저 시도해 보면 사용 중인 모든 것이 임의의 오프셋 데이터에서 자체 동기화될 수 있다는 것을 알 수 있습니다.