Como gravar multitrack indefinidamente

0

Eu não consigo passar ~ 10,5 minutos com 18 faixas sem perder amostras em uma divisão de arquivos. Eu tenho este script:

#!/bin/sh

# Dedicated SATA SSD for Recording
REC_DRIVE=/dev/sda
REC_PATH=/home/audiohub/Recordings
mount -t ext4 $REC_DRIVE "$REC_PATH"

# Start recording
#arecord --device=hw:CARD=X18XR18,DEV=0 --channels=18 --file-type=wav --format=S32_LE --rate=48000 --buffer-time=20000000 --max-file-time 300 "$REC_PATH/all_tracks.wav" &
#arecord --device=hw:CARD=X18XR18,DEV=0 --channels=18 --file-type=wav --format=S32_LE --rate=48000 --buffer-time=20000000 --separate-channels "$REC_PATH/track.wav" &
arecord --device=hw:CARD=X18XR18,DEV=0 --channels=18 --file-type=raw --format=S32_LE --rate=48000 --buffer-time=20000000 "$REC_PATH/all_tracks.raw" &
ARECORD_PID=$!

# Force a filesystem sync every 1 second to keep the buffer small enough to write without missing samples
COUNT=1
while kill -0 "$ARECORD_PID" > /dev/null 2>&1
do
    sleep 1
    echo sync $COUNT
    sync
    COUNT=$(($COUNT+1))
done
echo Recording has ended.

A primeira opção desse script (comentada) cria um monte de arquivos WAV de 5 minutos e 18 faixas que eu posso reorganizar com SoX em um monte de arquivos WAV inteiros de uma única faixa. Esta é atualmente a única maneira que conheço para capturar um show inteiro em multitrack, mas os arquivos WAV finais têm um "pop" a cada 5 minutos, como arecord está soltando amostras durante a divisão do arquivo.

A segunda opção (também comentada) falha imediatamente, mas cria um arquivo track.wav0 com tamanho zero.

A terceira opção (não comentada) é executada até que o arquivo all_tracks.raw atinja exatamente 2.0GiB e, em seguida, falha com a seguinte saída no arquivo de log:

Recording raw data '/home/audiohub/Recordings/all_tracks.raw' : Signed 32 bit Little Endian, Rate 48000 Hz, Channels 18
sync 1
sync 2
sync 3
sync 4
sync 5
...
sync 526
sync 527
sync 528
sync 529
sync 530
/home/audiohub/Recordings/all_tracks.raw: No such file or directory
sync 531
Recording has ended.

Eu posso dividir o arquivo all_tracks.raw com SoX em 18 arquivos WAV de uma única faixa e reproduzi-los corretamente no Audacity, então sei que está capturando bem ... pelo menos durante os primeiros ~ 10,5 minutos.

Existe uma maneira de capturar todo o espetáculo (pelo menos 4 horas) de áudio de 18 faixas sem perder nada?

    
por AaronD 05.01.2017 / 10:27

2 respostas

0

Seu problema é o formato de arquivo wav, que é essencialmente limitado a um tamanho de arquivo de 2GB. Veja link e link

Alguns programas permitem que você grave até 4 GB (eu uso o Ardour, e o Audacity também acredita nisso) para gravar em formatos alternativos quando precisar de tempos de gravação maiores.

    
por Charles Green 29.11.2017 / 19:12
0

@ O comentário do CL. foi a solução: canalizar o áudio através do stdout e deixar o sistema operacional manipular o arquivo.

O artigo completo está aqui , mas a resposta para esse problema específico é:

arecord --device=hw:CARD=X18XR18,DEV=0 --channels=18 --file-type=raw --format=S32_LE --rate=48000 --buffer-time=20000000 > "$REC_FILE" 2> >(ts -s >&2) &

O std de 2> >(ts -s >&2) nos tubos de final arecord para stdin de ts e stdout de ts para o stderr do script. O script de chamada canaliza o stderr deste script para um arquivo de log.

ts adiciona um registro de data e hora a cada linha de seu stdin e imprime o resultado em sua stdout. Então, quando eu olho para o arquivo de log, eu posso ver se houve algum problema, e se houve, onde procurar falhas / pops na gravação multi-track de várias horas.

Em seguida, para converter o arquivo bruto em um conjunto de WAVs mono completos:

TRACKS=18
CHANNEL=$TRACKS
while [ $CHANNEL -ge 1 ]
do
  FILENAME=track$CHANNEL.wav
  sox --type raw --bits 32 --channels $TRACKS --encoding signed-integer --rate 48000 --endian little all_tracks.raw $FILENAME remix $CHANNEL
  CHANNEL='expr $CHANNEL - 1'
done

Você pode adicionar alguns echo s para informar o andamento. Isso tende a demorar um pouco.

    
por AaronD 30.11.2017 / 21:05