Android:如何以MP3格式获取媒体录制器输出?

17

我正在创建一个包含录音和播放的应用程序。是否可以以MP3格式录制文件?

我需要输出文件为mp3格式。谢谢。


FYI:MP3技术已经被专利保护。如果你打算使用MP3来减少本地存储空间的使用(并且假设这是一个商业应用程序),最好使用类似Ogg Vorbis的其他技术。 - MusiGenesis
1
嗨,在Android中,我正在记录原始流中的声音,并将其转换为wav格式。但在wav格式中,文件大小更大,我需要减小文件大小,因此我想将其转换为wav到mp3格式。我在这里看到了https://dev59.com/iXA65IYBdhLWcg3wxRo8,但我不知道如何在Android上使用它,请帮助我。 - M.A.Murali
可能是Android:以mp3格式录制声音的重复问题。 - grebulon
3个回答

14

据我所知,Android框架中目前没有内置MP3编码器,因此您无法直接完成该操作。您需要向项目添加MP3编码库才能进行操作。

为此,您可以查看stackoverflow帖子获取完整答案。


嗨,在Android中,我正在记录原始流中的声音并将其转换为wav格式。但是在wav格式中占用更多的空间,因此我需要减小文件大小,所以我想将其转换为mp3格式。我看到了这里发布的链接,但我不知道如何在Android上使用它,请帮帮我。 - M.A.Murali
这在2021年是否仍然成立?MP3已经存在了很长时间,我听说自2017年以来已经免费使用专利/许可证。 - Phil
@Phil 如果您查看受支持的媒体格式(https://developer.android.com/guide/topics/media/media-formats),您会发现 Android 上仍然没有 MP3 编码器。只有解码器。 - Lior

9

Android框架中肯定有MP3编码器。

就像我在stackoverflow上回答的那样,你所需要做的就是:

MediaRecorder 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。

有趣的是,这个解决方案是我试验了什么有效后得出的,我不知道为什么它有效。我希望有人能在评论中阐明一下。 编辑 正如@JohnSmith和其他一些人在评论中指出的那样,这并没有对音频进行MP3编码,Android上也没有内置的MP3编码器。
这个解决方案之所以似乎有效,是因为MediaPlayer在开始播放音轨之前就将编码识别为AAC(而不管文件扩展名如何)。因此,尽管输出文件的MIME类型是audio/mp4,但编码肯定是AAC。

它并不会创建实际的MP3文件,它只是创建一个扩展名为MP3的音频文件,但实际上它并不是一个真正的MP3文件。 - Harpreet
实际上,创建的文件返回的MIME类型是audio/mp4。它听起来像mp3,但我注意到它不一样。 - Lettings Mall
3
这个答案显然是不正确的。之所以看起来有效,是因为大多数玩家足够聪明,能够发现文件虽然被称为myrecording.mp3,但它实际上是一个AAC编码的音频流,存在于MP4容器中。MP3在Android上不是本地格式(毫无疑问是由于版权问题)。你只是伪装成了M4A或AAC格式,而不是MP3。我在我的应用程序中找到的最好的方法是使用Java LAME库 http://github.com/nwaldispuehl/java-lame。 - John Smith
正如@JohnSmith和其他人所指出的那样,Android没有内置MP3编码器,并且上述代码生成的文件不是MP3编码的。感谢分享Lame库的Java移植版,John,这是最好的用于MP3编码的资源。 - Advait Saravade

9

2015年更新:

android已经正式支持MP3 - (编辑) - 不过仅限于解码,不支持编码。

http://developer.android.com/guide/appendix/media-formats.html

核心媒体格式: MP3 • 单声道/立体声8-320Kbps 恒定比特率(CBR)或可变比特率(VBR) MP3 (.mp3)

  • (编辑) - 为了使文件大小更小,可以使用.mp4格式。您可以这样设置:

    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);


2
我认为不支持录制,因为在编码端我没有看到一个点。 - Eric Kim
它可以容纳MP3文件 - MPEG-2/4 (HE)-AAC,MPEG-1/2层I、II、III(MP3),AC-3,Apple Lossless,ALS,SLS,Vorbis(带有私有的objectTypeIndication),其他[26]。 - David
输出格式和编码是两个不同的概念。你可以将输出格式设置为MP4,但如果你没有用MP3进行编码,那么它就不是一个合适的MP3文件。 - Eric Kim
你说得对。我的应用程序正在将文件记录为 .mp3 格式。我会看看是否有什么不同的地方。 - David
2
仅仅因为你的文件扩展名是 .mp3 并且可以播放,并不意味着它是正确的 mp3 文件。我很确定 Android 不会默认这样做。 - Eric Kim
显示剩余2条评论

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