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 파일을 생성하는 것 같고, 2) 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형식이 변환되지 않는 경우 이는 최종 분석의 제한 사항이 아니며 청취자에게도 해당됩니다. 혼란스러운 것도 고치기 쉽습니다.

관련 정보