如何以mp3格式保存音频文件。为什么android没有这种基本支持?

时间:2014-07-05 05:18:28

标签: android android-audiorecord

如何以mp3格式保存音频文件。为什么android没有这种基本支持?

保存为3GP:

 mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
 mFileName += "/audiorecordtest.3gp";

 private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }
  1. 我尝试使用Lame将3gp文件转换为MP3,但是如果想要使用 Lame,我需要NDK。我试图在不使用NDK(reference)的情况下进行转换。是否可以 有可能这样做吗?
  2. 为什么MediaRecorder.OutputFormat类在Android中没有基本的mp3支持?

5 个答案:

答案 0 :(得分:2)

  1. 不是我所知道的。你不一定要使用NDK自己构建Lame,但是,你可以使用预编译的.so,包含它,然后只使用JNI。例如,请查看this project
  2. 如果我不得不猜测,我会说这是因为专利。但谁知道:)。

答案 1 :(得分:0)

1)尝试在不使用NDK的情况下将一种编码格式转换为另一种格式。 将一种形式或编码数据转换为另一种形式或编码数据的过程称为"转码"。转码的工作方式(据我所知)是 - 解码文件格式A> 将原始文件编码为格式B.所有这些都是繁重的信号处理工作和大量的指针访问(..很多)。在java中执行此操作并不高效,而C / C ++是最好的。因此,您无法避免某些本机NDK调用,也无法避免使用C / C ++

2)MP3格式不是免费格式。有一家名为technicolor(Check:http://mp3licensing.com/mp3/index.html)的公司控制着mp3编码器的许可。请注意,如果您要推出带有mp3编码器的产品,您必须获得许可证(检查许可证协议)并且它不是免费的。所以android是一个开源的OS不能给mp3编码。您可以使用第三方编码器。从我提到的网站上阅读许可协议。

如果我错了,请纠正我。

此致 Shrish

答案 2 :(得分:0)

(更新)

Android正式支持MP3,但仅限于DEcoding:

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

  

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

您可以使用mpeg4作为替代方案。

您可以使用以下方式进行设置:

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

答案 3 :(得分:0)

将录音机的输出格式设置为mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);,结果录音将是一个mp3文件。我用过这个。

答案 4 :(得分:0)

即使您的MediaRecorder创建的文件具有.mp3名称后缀,它也不是真正的mp3。真正的MP3文件以ID3标签开头,而不是0x00..ftyp3gp4'