安卓:以mp3格式录制声音

22

我正在开发一个Android应用程序,具有通过麦克风捕捉声音并通过耳机播放声音的功能。为此,我使用了"AudioRecord"和"AudioTrack"。以下是我正在使用的部分代码(仅用于理解)

mInBufferSize = AudioRecord.getMinBufferSize(mSampleRate,
            AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat);
mOutBufferSize = AudioTrack.getMinBufferSize(mSampleRate,
            AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat);
mAudioInput = new AudioRecord(MediaRecorder.AudioSource.MIC,
            mSampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat,
            mInBufferSize);
mAudioOutput = new AudioTrack(AudioManager.STREAM_MUSIC, mSampleRate,
            AudioFormat.CHANNEL_CONFIGURATION_MONO, mFormat,
            mOutBufferSize, AudioTrack.MODE_STREAM);

但主要问题是我想以mp3格式录制传入的声音?请帮帮我,我会非常感激...

提前致谢

6个回答

52

使用MediaRecorder保存.mp3文件有一个解决方法。以下是具体步骤:

recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setOutputFile(Environment.getExternalStorageDirectory()
        .getAbsolutePath() + "/myrecording.mp3");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.prepare();
recorder.start();

重要的部分在于 setOutputFormatsetAudioEncoder。显然,如果同时使用 MediaRecorder.OutputFormat.MPEG_4MediaRecorder.AudioEncoder.AAC,MediaRecorder会记录可播放的mp3文件。希望这能帮助到有需要的人。

当然,如果你宁愿使用AudioRecorder类,我认为 Chirag 在下面链接中提供的源代码应该也可以正常工作 - https://github.com/yhirano/Mp3VoiceRecorderSampleForAndroid(虽然你可能需要将其中一些从日语翻译成英语)

编辑:正如 Bruno 和其他一些评论中指出的那样,这并没有将文件编码为 MP3。编码仍然是 AAC。但是,如果你尝试通过上述代码保存具有 .mp3 扩展名的音频文件,它仍然可以正常播放,因为大多数媒体播放器都足够聪明,可以检测到真实的编码方式。


我很惊讶大多数开发者并不知道录制MP3有多容易!谢谢! - nat101
在一些设备上使用AudioEncoder.ACC会产生一些奇怪的效果...出于某种原因,在Lenovo Tab3上的Android 6.0系统中录制音频速度过快。我最终使用了MediaRecorder.AudioEncoder.AMR_NB,并且效果很好。 - velval
6
抱歉,但这并没有产生 MP3 编码的文件。它们仍然是 AAC 编码的(至少在我的 Galaxy S6 上)。 - Bruno Jennrich
6
各位,仅仅因为你把文件扩展名命名为MP3,并不意味着它就是MP3格式!它是AAC编码的,不支持AAC的设备将无法播放它!因此,这不是一个解决方法,也不应该得到赞同。 - Krystian
你需要使用 .m4a 扩展名 - 这是实际的扩展名,并且在大多数平台(iOS、Web)上都被广泛接受。 - Sameer J
有些软件无法识别以这种方式保存的文件为mp3文件,例如Audacity(2022年)。 - Luis A. Florit

11

在这里,您可以找到用于Android的Mp3语音录音机示例的源代码。

查看此源代码。


这是一个非常好的答案,我准备接受它,但问题是它影响了“AudioTrack”,我的意思是使用这段代码后,我无法在耳机中听到声音。这两个过程可以同时进行吗?比如使用“AudioTrack”播放声音并将其录制为mp3?谢谢回答。 - user609239
据我所知,Android 4及以下版本不允许您在录音时播放声音。 - Ata
1
这个项目可能更好:https://github.com/talzeus/AndroidMp3Recorder,它没有日语字符。它们都使用mp3lame库。 - Richard
@Richard,我该如何在我的项目中使用上面的链接?有没有通过gradle等方式编译它的方法?请帮忙。 - Hyder
@Sha 你需要在Linux系统上设置编译环境。 - Richard
显示剩余3条评论

1
我知道这是一个老问题,但如果有帮助的话,我创建了一个Android Java完整录音应用程序演示的存储库,输出文件是mp3文件。 请注意,我将目标SDK设置为21,以消除请求用户权限的需要。这仅用于演示目的。 您可以克隆并使用它。
我使用的大部分代码都来自于此存储库:this 我的演示存储库:mp3 recording app

0

将录音机的outputformat设置为MediaRecorder.OutputFormat.DEFAULT。我已经使用过了,生成的音频文件是mp3格式的。


你好。我尝试了这个操作,并将结果通过'adb pull'传输到我的Linux开发主机上。结果文件显示:/home/sjs/AudioDemo.mp3: ISO媒体,MPEG v4系统,3GPP。也就是说,该文件是一个mp4文件。设备是运行Android 6.0.1的Nexus 7。非常抱歉并感谢您的理解。 - steven smith

-2

这对我有用

mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory()
    .getAbsolutePath() + "/record.mp3");
mediaRecorder.prepare();
mediaRecorder.start();

-3

这对我来说是工作

outputFile = Environment.getExternalStorageDirectory()
            .getAbsolutePath() + "/myrecording.mp3";
    myAudioRecorder = new MediaRecorder();
    myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
    myAudioRecorder.setOutputFile(outputFile);`

myAudioRecorder.prepare(); myAudioRecorder.start();

我的音频录制器准备好了; 我的音频录制器开始运行;


3
这个设备不支持记录mp3格式的音频,只会把文件扩展名命名为mo3,但实际文件格式并非mp3。 - m.hashemian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接