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

관련 정보