Concatenando vários arquivos de áudio wav de 24 bits e 96 kHz usando ffmpeg, shntool e sox

3

Estou tentando concatenar arquivos de áudio de 15 wav, gravados como PCM linear de 24 bits, 96kHz. Eu executei experimentos com ffmpeg, shntool e sox, com resultados diferentes.

Os arquivos foram criados por um gravador Zoom H2n, que dividiu as ~ 15 horas de gravação contínua em vários arquivos (em tempo real) para acomodar a especificação do cartão de memória SD.

Os primeiros 14 arquivos são 2.147.385.344 bytes (1: 02: 08.04 no tempo) e o último arquivo é 1.838.248.046 bytes (53: 11.35 no tempo). Os arquivos originais relatam uma taxa de bits de 4.608 kb / s (usando ffmpeg -i).

Usando o ffmpeg

Crie um arquivo de texto com os nomes dos arquivos:

printf "file '%s'\n" ./*.WAV > mylist.txt

Concatenar os arquivos:

ffmpeg -f concat -i mylist.txt -c copy output-ffmpeg.wav

Isso gera um arquivo com 31,901,151,444 bytes, mas reporta apenas 53:08 no tempo. ffmpeg -i reporta uma taxa de bits de 80.049 kb / s, muito maior que os 4.608 kb / s originais.

Usando o shntool

Junte-se aos arquivos:

shntool join -r none 01.wav 02.wav [etc]

Isso gera um arquivo com 31,901,151,386 bytes - diferente do ffmpeg concatenate - mas também como 53: 08.16 no tempo. Novamente, ffmpeg -i reporta uma taxa de bits de 80.049 kb / s, muito maior que os 4.608 kb / s originais.

Usando o Sox

Concatenar os arquivos:

sox 01.wav 02.wav [etc] output-sox.wav

Isso gera um arquivo com 31,901,151,422 bytes - diferente do ffmpeg e do shntool - mas reporta como 01: 02: 08.26 no tempo. O ffmpeg -i reporta uma taxa de bits de 68.452 kb / s, muito maior do que os 4.608 kb / s originais, mas diferente das conversões ffmpeg ou shntool.

Perguntas

1) Como posso fazer o arquivo refletir o tempo real? Levar esta gravação de 31 Gb / ~ 15 horas a um software de áudio que pensa que tem apenas 53 minutos de duração é provavelmente problemático.

2) Por que as três concatenações diferem no tamanho do arquivo? Existe uma bandeira ou configuração que eu deveria estar usando para, por exemplo, preencher o comprimento por algum motivo? Os diferentes tamanhos de arquivo são uma pista de por que os arquivos acham que são apenas 53:08 ou 01:02:08 longos?

Quando vi pela primeira vez o 53:08, pensei: Ah, está escrevendo o tamanho do tempo do arquivo final no cabeçalho - mas a duração do arquivo final é 53:11. Quando vi o 01: 02: 08.26 pela primeira vez, pensei: Ah, está escrevendo a duração do arquivo FIRST, mas infelizmente, não (próximo, mas não exato).

Parece que minha melhor dica é a taxa de bits incorreta (?) dos arquivos concatenados. Estou surpreso que uma cópia de fluxo ou uma concatenação de arquivos mude isso. Talvez seja apenas um erro de metadados?

    
por Michael J. 02.07.2015 / 17:13

1 resposta

3

.wav é um RIFF Formato de arquivo (msdn)

O tamanho dos dados do bloco RIFF é armazenado em 32 bits. (valor máximo não assinado é 4 294 967 295)

RIFF is limited to ~4.2 GBytes per file.

Quando o software cria um bloco RIFF muito grande, seu tamanho de armazenamento é de 32 bits.

Em algum ponto, ocorre um estouro de inteiro e um número maior de bits é eliminado :

Example file: 6.220 GBytes / 3:00:00 / 96000 Hz / 24 bit / 2 channels / 4608 kbit/s

Real file size(hex):              01 72 C9 E0 86  (6 220 800 134)
Readed from RIFF header(hex) :       72 C9 E0 7E  (1 925 832 830)

Real file size(binary):            1 01110010 11001001 11100000 10000110  //33 bits
Readed from RIFF header(binary):     01110010 11001001 11100000 01111110  //32 bits

01 aqui é descartado.

relatório ffprobe:

Duration: 00:55:43.46, bitrate: 14884 kb/s
 Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, 2 channels, s32 (24 bit), 4608 kb/s

FFprobe duração errada / taxa de bits

O FFprobe não pode encontrar nenhum metadado no arquivo e tentar calculá-lo a partir de dados verdadeiros :

  1. Um fluxo com taxa de bits: 4608 kbit / s (96000 Hz * 24 bits * 2 canais)
  2. Tamanho do bloco RIFF: 1 925 832 830 (verdadeiro, mas errado: D)

A duração será (tamanho total do bloco dividido pela taxa de bits):

1 925 832 830 / (4 608 000 / 8) = 3343.459 seconds

/ 8 é porque a taxa de bits é bits por segundo (um byte é 8 bits)

3343.459 é exatamente 00: 55: 43.459

( Média? ) A taxa de bits para o arquivo inteiro é SizeOfFile / TotalSeconds:

6 220 800 134 / 3343.459 = 1860588.1316 Bytes/s ( 14884705.053 bits/s )

Como obter um arquivo grande?

Use outros formatos para armazená-lo, como:

FLAC / .rf64 / .w64 / Etc.

Para concatenar arquivos usando o ffmpeg ( Concatenar a página Wiki do FFmpeg ):

ffmpeg -f concat -i mylist.txt -c:a flac output-ffmpeg.flac

em que mylist.txt é

file '/path/to/file1.wav'
file '/path/to/file2.wav'
file '/path/to/file3.wav'

Já tem um arquivo WAV grande?

Você pode reproduzi-lo . Todo. Com um truque.
Vamos definir o tamanho do pedaço de dados RIFF como 0 . Isso fará com que alguns players de áudio (?) leiam todo o pedaço de dados (até o final do arquivo ? ).

Relatório FFprobe do arquivo editado:

Duration: 03:00:00.00, bitrate: 4608 kb/s
 Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, 2 channels, s32 (24 bit), 4608 kb/s

NOTE: Rewriting full file is not required when saving file in HEX editor.

  1. Faça o download de um editor HEX gratuito (HxD por exemplo)
  2. Faça uma captura de tela ou uma cópia dos bytes marcados. (como backup)
  3. Preencha com 00 .
  4. Se estiver usando o HxD: Pressione o botão save e depois Cancel imediatamente (para impedir a criação da cópia de backup completa)
  5. Abrir. (Testado em VLC / MPC-HC . Mas o WMP falhou: D)

Alémdisso,oFLACpodeconvertê-lousandoa opção --ignore-chunk-sizes

Mas O FLAC soltará um erro se o .WAV tiver alguns metadados no final do arquivo.
Testado com o Audacity. Verificado com o editor HEX e encontrado metadados no final do arquivo.

FLAC: ERROR: got partial sample
Mas arquive com 2:59:59 segundos de duração. E sem o checksum md5.
Isso significa que temos não verdadeiro arquivo flac (leia corrompido ).
Mas legível.

    
por 03.07.2015 / 21:29

Tags