MPEG ADTS MP3から通常のMP3にロスレス変換

MPEG ADTS MP3から通常のMP3にロスレス変換

ADTSでエンコードされたMP3オーディオファイルがたくさんあります。残念ながら、私のカーラジオはADTSをサポートしていないため、トランスポートストリームなしで通常のMP3ファイルに変換する必要があります。

外に人が多い同じ質問をした人しかし、私が見つけた唯一の答えはwavに変換してからlameenc再びMP3に変換することです。

デコード/再エンコードなしでこれらのファイルを変換する方法があると確信しています。

ffmpeg試してみましたが、avconvそのパラメータは-acodec copyADTSとは異なる内容を出力しないようです。

私もGStreamerで遊んだ。興味深いことに、aacparseモジュールは少なくともフォーマットを理解することができますが、デモではありません。

これを達成するためにどのツールを使用できますか?

$ 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

サンプルファイルを見つけることができますここ概要)

修正する: まだテストしていますが、1)LameもADTSファイルを生成しているようです。現在、さまざまなプロファイルとビットレート、VBR、CBRを使用してテストしています。しかし、誰かがADTSについてもっと知っているなら、それはまだ役に立ちます。

答え1

デコードや再エンコードなしでMPEG ADTSをMP3に変換する方法はありません。基本的に異なる形式/エンコードです。直接変換を実行すると主張する変換ユーティリティは、実際にはロスレス形式でデコードし、一部のMP3バージョンに再エンコードするなどの作業を後で行っています。これを念頭に置いて、soxオーディオフォーマットの変換を強くお勧めします。自分を「オーディオ処理分野のスイス軍用ナイフ」と呼んでも、決して誇張ではありません。構文は簡単です。sox infile outfileしかし、利用可能なオプションはffmpeg比較されません。

答え2

私の車にラジオを置いてからかなり古いです。今はどのラジオで作ったのかさえわかりませんが、結局そうになりました。 (最終的な解決策が私が最初に要求したものとまったく異なるため、答えはトピックから少しずれていましたが、制限されたmp3プレーヤーの問題を検出するのに役立ちますので、まだ興味深く、これが私がこの投稿を書いた理由です。あります。本当に興味深いのは、結果そのものではありません。どのように見つけました):

私のアプローチは次のとおりです。

  • さまざまなエンコーディングで複数のサンプルファイルを生成する
  • ラジオから出てくるすべての曲を編み、紙に良い曲と悪い曲を表示します。

しかし、長いオーディオサンプルを聴くには時間がかかります。クイックサンプルを再生し、モニターと紙の両方を画面に保持することは私には適していません。私はいつも線を越えています。だから最後に、私は与えられたテスト数を音響的に含めるためにtts(テキスト音声変換)ツールを使用することにしました。入力するテストファイルごとに次のような内容が聞こえます。

  • A 1
  • 地下1階
  • B3

すなわち、テストA1、B1及びB3は全て良好であるが、A2、B2及びA3は全く実行されない。これらすべてを記録すると、libreofficeのピボットテーブル機能を使用して次のチャートを準備するのに役立つリストが作成されました。

1

テストファイルの生成に使用するスクリプトは次のとおりです。

sudo apt-get install lame ffmpeg espeak file

#!/bin/bash
for enc in ffmpeg lame; do
  i=1
  case "$enc" in
    ffmpeg)
      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
        ffmpeg)
          cmd=( ffmpeg -i "$basename.wav" -b:a "${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

注:ご覧のように、上記の実装されたバージョンでは$iエンコーダと正確に一致しないため、A一部のB形式が変換されない場合、これは最終分析の制限ではなく、リスナーにも当てはまります。混乱しているのも修正しやすいです。

関連情報