我有很多 ADTS 编码的 MP3 音频文件。不幸的是,我的汽车收音机不支持 ADTS,因此我需要将它们转换为没有传输流的普通 MP3 文件。
外面有很多人谁问了同样的问题,但我发现的唯一答案是转换为 wav,然后将lameenc
其转换回 MP3
我确信有一种方法可以转换这些文件而无需解码/重新编码。
我已经尝试过ffmpeg
/ avconv
,但该参数-acodec copy
似乎没有输出任何与 ADTS 不同的内容。
我也玩过 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(文本转语音)工具以声学方式包含给定测试的数量进入每个测试文件,以便我听到类似以下内容:
- 甲 1
- 乙1
- 乙3
这意味着:测试A1、B1和B3都很好,而A2、B2和A3根本没有发挥。写下所有这些最终形成了一个列表,它帮助我使用 libreoffice 的数据透视表功能准备以下图表:
这是我用来生成测试文件的脚本:
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
以防某些格式未转换,但这并不是最终分析的限制,只是对侦听器,如果太混乱也很容易修复。