【问题标题】:Audio format for iOS and Android适用于 iOS 和 Android 的音频格式
【发布时间】:2013-03-30 01:56:24
【问题描述】:

抱歉,我问的问题太笼统了。

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

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

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

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

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

【问题讨论】:

  • mp4 和 aac 是两个不同的概念。 mp4是容器格式,aac是编码。

标签: android ios audio format


【解决方案1】:

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];

对于 Android:

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);

【讨论】:

  • 抱歉,iOS 上记录文件的扩展名和 mimeType 究竟是什么?
【解决方案2】:

我们最近完成了一个应用程序,该应用程序具有从 iOS 和 Android 录制和收听的这种功能,以下是我们供您参考的代码。我们依靠我们的网络服务和服务器转换为 .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 的转换代码,通过谷歌搜索(la脚或 faad 一些类似的实用程序)环顾四周。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我们最近遇到了这个互操作性问题。我们试图在两个平台上以 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 录制文件,可以在两个平台上播放。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这将以编程方式帮助您,文件扩展名可能是 mp3/mp4 音频;两者都将支持媒体播放器。 Android sn-p:

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

        iOS sn-p

        AVFormatIDKey: @(kAudioFormatMPEG4AAC)
        

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            iOS 使用 kAudioFormatMPEG

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-06-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-21
              • 1970-01-01
              相关资源
              最近更新 更多