Armazena os N MBs mais recentes de um fluxo?

3

Atualmente, uso wget ou curl para fazer o download de um fluxo AAC contínuo. Eu gostaria de limitar o que está armazenado no disco para o mais recente N MB. Em outras palavras, algum tipo de tamanho limitou o buffer FIFO (eu acho?). Alguma idéia de como fazer isso? Este é o OS X / BSD.

O objetivo é poder interromper o fluxo quando algo interessante acontecer e extrair os últimos minutos dele para um armazenamento permanente.

Atualização: uma solução alternativa seria interromper cada N MB e iniciar um novo arquivo local e girar o arquivo anterior (ou seja, renomeá-lo com um número de sequência, registro de data e hora ou similar). No entanto, se fizer isso, é necessário haver uma sobreposição substancial entre os arquivos.

    
por d-b 22.10.2017 / 20:56

1 resposta

1

Aqui está um script python simples que pode ajudar. Ele apenas lê stdin e grava em stdout, mas mantém os últimos N bytes na memória. Se você interrompê-lo com o controle-C (SIGINT), ele despeja a memória no arquivo /tmp/sample001 e continua.

#!/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()

Se você não tiver python3, precisará de algumas alterações para o python 2.7. Talvez seja necessário se preocupar em como preservar um formato de enquadramento AAC legal, mas, talvez, se você tentar primeiro, pode descobrir que o que está usando gerencia a auto-sincronização de dados arbitrários de deslocamento.

    
por 01.11.2017 / 18:36