Conversão sem perdas de MPEG ADTS MP3 para MP3 normal

7

Eu tenho muitos arquivos de áudio MP3 que são codificados por ADTS. Infelizmente, o meu auto-rádio não suporta ADTS, então eu preciso convertê-los para arquivos normais de MP3 sem um fluxo de transporte.

Há muitas pessoas por aí que pediram ao mesma pergunta , mas as únicas respostas que encontrei foi converter para wav e usar lameenc para convertê-lo de volta para MP3

Tenho certeza de que há uma maneira de converter esses arquivos sem decodificá-los / reencodificá-los.

Eu já experimentei o ffmpeg / avconv , mas o parâmetro -acodec copy parece não ter saída diferente do ADTS.

Eu também brinquei com o GStreamer. Engraçado, eu acho que é o módulo aacparse que pelo menos entende o formato, mas não é um demuxer.

Qual ferramenta posso usar para isso?

$ file badfile.mp3 goodfile.mp3
badfile.mp3:  MPEG ADTS, layer III, v2,  64 kbps, 22.05 kHz, JntStereo
goodfile.mp3: Audio file with ID3 version 2.4.0

Um arquivo de exemplo pode ser encontrado aqui (Overview )

Atualização: Eu ainda estou testando, mas parece que 1) Também coxo produz arquivos ADTS e 2) ADTS não é realmente o problema para o meu rádio de carro, deve ser algo diferente. Estou testando agora com diferentes perfis e taxas de bits, VBR e CBR. Mas ainda é útil se alguém souber algo mais sobre o ADTS.

    
por Daniel Alder 03.01.2015 / 18:22

2 respostas

4

Não há como converter MPEG ADTS em MP3 sem decodificá-los e reencodificá-los. São formatos / codificações fundamentalmente diferentes. Qualquer utilitário de conversão que você use para fazer uma conversão direta está de fato fazendo isso nos bastidores - decodificando para algum formato sem perdas e reencodificando para alguma versão do MP3. Com isso em mente, eu recomendo altamente sox para conversões de formato de áudio. Realmente não está exagerando quando se refere a si mesmo como o "Canivete do Exército Suíço de Manipulação de Áudio". A sintaxe é simples: sox infile outfile , mas as opções disponíveis colocam ffmpeg como vergonha.

    
por 21.09.2015 / 15:15
2

Já faz algum tempo e eu não tenho mais o carro com o rádio. Atualmente, eu não posso mais dizer qual rádio é, mas aqui está o que eu finalmente fiz. (A resposta é de alguma forma fora do tópico porque a solução final não foi exatamente o que eu inicialmente pedi. Mas ainda é interessante porque ajuda a detectar problemas com mp3 players limitados, e também escrevo isso por causa do crescente número de votos para a pergunta: -). A coisa realmente interessante não é o resultado em si, mas como eu achei):

Minha abordagem foi a seguinte:

  • Gerar muitos arquivos de amostra com codificações diferentes
  • Reproduzir todos eles no rádio e marcar os bons e os ruins em um papel

Mas ouvir longas amostras de áudio levou muito tempo. Reproduzir amostras rápidas e manter a exibição e o papel à minha vista não funcionou para mim, eu sempre pulei as linhas. Então, finalmente, decidi usar uma ferramenta tts (text-to-speech) para incluir o número do teste dado acusticamente em cada arquivo de teste, para que eu ouvisse algo como:

  • A 1
  • B 1
  • B 3

O que significa: os testes A1, B1 e B3 foram bons, enquanto A2, B2 e A3 não foram reproduzidos. Escrever tudo isso finalmente resultou em uma lista que me ajudou a preparar o quadro a seguir usando o recurso de ativação do libreoffice:

Esteéoscriptqueeuuseiparagerarosarquivosdeteste.Esperoqueajudealguémaresolverumproblemasemelhante:

forencinaconvlame;doi=1case"$enc" in
    aconv)
      test=A
      ;;
    lame)
      test=B
      ;;
  esac
  mkdir "$test/"

  for freq in 8000 11025 12000 16000 22050 24000 32000 44100 48000 ; do
    for bitrate in  8 16 24 32 40 48 56 64 80 96 112 128 144 160 192 224 256 320 ; do
      echo "=== ${test} ${i} ${freq} ${bitrate} ==="
      basename="$test/'printf "%s_%03d_" $test $i'"
      rm "$basename"*
      basename="${basename}${freq}_${bitrate}"
      espeak -v german "$test $i" -w "$basename.wav"

      case "$enc" in
        aconv)Selection_001
          cmd=( avconv -i "$basename.wav" -b "${bitrate}k" -ar "$freq" "$basename.mp3" )
          ;;
        lame)
          cmd=( lame --resample "$freq" -m s -b "$bitrate" "$basename.wav" "$basename.mp3" )
          ;;
      esac

      "${cmd[@]}" || continue

      [ -s "$basename.mp3" ] || continue
      t="'file -b "$basename.mp3"'"
      [ "$t" != "$ot" ]      || continue
      ot="$t"

      echo "$test;$i;$enc;$bitrate;$freq;\"$basename.mp3\";\"$cmd[*]\"" >"$basename.csv"
      i=$((i+1))
    done
  done
done
cat ?/*.csv >alltests.csv
rm ?/*.wav ?/*.csv

Observação: como você pode ver: na versão acima da implementação, $i não corresponde exatamente aos codificadores A e B no caso de alguns formatos não serem convertidos, mas isso não é limitação para a análise final, apenas um pouco confuso para o ouvinte, e fácil de corrigir se for muito confuso.

    
por 27.09.2017 / 10:21

Tags