21

对不起,如果我问的问题太笼统。

我们正在开发一个在移动设备上录制和播放音频的应用程序。此应用程序正在为 Android 和 iOS 开发。该应用程序将使用设备麦克风录制音频并将其存储在服务器中。

用户(在 Android 和 iOS 上)可以打开应用程序并播放存储在服务器上的声音。我们使用的声音格式是 AAC。在 iOS 中它工作正常。我们可以录制和播放 AAC 文件。

但在 Android(三星 S3 和三星 Galaxy Y)上,我们无法以 AAC 格式录制声音。但在 S3 中我们可以播放 AAC 文件。

我的问题是,我们应该选择哪种格式在 Android(应该支持从 2.3 到 Jellybean)和 iOS 中录制和播放。我们应该使用 MP4 吗?

我们的一种解决方案是,在后端,我们可以将音频文件转换为 AAC、MP4 或 3GP,并根据版本将支持的文件提供给手机。

4

7 回答 7

31

Android 和 iOS 使用同一台服务器来存储记录。所有记录都被保存,没有任何扩展名。

Android从服务器下载记录时,我的应用会添加一个“ .aac ”扩展名。
使用iOS时,它会添加一个“ .m4a ”扩展名。

相同的记录在两个移动平台上都表现良好。

在 iOS 上录制:

NSDictionary recorderSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
                        [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
                        [NSNumber numberWithInt:16000],AVSampleRateKey,
                        [NSNumber numberWithInt:1],AVNumberOfChannelsKey,
                        [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                        [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                        [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                        nil];

对于安卓:

myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
myRecorder.setAudioSamplingRate(16000);
myRecorder.setAudioChannels(1);
mRecorder.setOutputFile(fileName);
于 2015-10-26T12:05:25.897 回答
13

我们最近完成了一个应用程序,该应用程序具有从 iOS 和 Android 录制和收听的这种功能,下面是我们供您参考的代码。我们依靠我们的 web 服务和服务器转换为可以在两者中轻松播放的 .mp3 格式平台。

//iPhone side code. records m4a file format (small in size)

NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
                                [NSNumber numberWithFloat:16000.0], AVSampleRateKey,
                                [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
                                nil];
NSError *error = nil;
audioRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error];

if (error)
    NSLog(@"error: %@", [error localizedDescription]);
else
    [audioRecorder prepareToRecord];


//Android side code. (records mp4 format and it works straight away by giving mp3 extension.)
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setAudioEncodingBitRate(256);
recorder.setAudioChannels(1);
recorder.setAudioSamplingRate(44100);
recorder.setOutputFile(getFilename());

try {
    recorder.prepare();
    recorder.start();
    myCount=new MyCount(thirtysec, onesecond);
    myCount.start();
    recordingDone=true;
    count=0;
    handler.sendEmptyMessage(0);
    if(progressDialog.isShowing())
        progressDialog.dismiss();
} catch (IllegalStateException e) {
    e.printStackTrace();
    StringWriter strTrace = new StringWriter();
    e.printStackTrace(new PrintWriter(strTrace));
    CrashReportActivity.appendLog(
                                  "\nEXCEPTION : \n" + strTrace.toString() + "\n",
                                  Comment.this);
} catch (IOException e) {
    e.printStackTrace();
    StringWriter strTrace = new StringWriter();
    e.printStackTrace(new PrintWriter(strTrace));
    CrashReportActivity.appendLog(
                                  "\nEXCEPTION : \n" + strTrace.toString() + "\n",
                                  Comment.this);
}

您可以轻松地在 .Net 中找到从 m4a 到 mp3 的转换代码,通过谷歌搜索四处查看(lame 或 faad 一些类似的实用程序)。

希望这可以帮助。

于 2013-04-08T05:38:23.973 回答
5

我们最近遇到了这个互操作性问题。我们试图在两个平台上以 aac 格式录制文件,但使用三星手机录制的文件无法在 iOS 中播放。因此,我们必须同时使用 3gp 和 aac 格式才能在 android 和 ios 的多个设备上播放文件。

以下是我们在 Android 中录制文件时使用的代码:

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mRecorder.setOutputFile(fileName);

我们将录制文件的扩展名保留为 .3gp。

然而,在 iOS 中,无法在 3gp 中进行录制,因此我们在 iOS 中以 .aac 格式录制文件,该文件可以在两个平台上播放。

于 2015-07-23T04:41:25.123 回答
3

通过 MPEG4 和 AAC 组合,所有音频都可以在 Android 上播放。但在 iOS 上,我们必须使用“m4a”作为文件扩展名,以便播放 Android 音频。

于 2015-11-17T23:42:55.637 回答
1

以编程方式,这将对您有所帮助,并且文件扩展名可能是 mp3/mp4 用于音频;两者都将支持媒体播放器。安卓片段:

myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

iOS 片段

AVFormatIDKey: @(kAudioFormatMPEG4AAC)
于 2015-04-18T10:13:48.257 回答
0

试试这个,我遇到了同样的问题,它工作得很好。

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
于 2019-10-25T06:56:41.670 回答
-1

Android 使用输出格式MPEG 4和音频编码器AAC

iOS 使用kAudioFormatMPEG

于 2016-01-07T05:43:13.727 回答