【问题标题】:Why is Codename One on iOS recording audio as CAF?为什么 iOS 上的 Codename One 将音频录制为 CAF?
【发布时间】:2017-04-06 02:26:46
【问题描述】:

我的问题与此other SO question 有关。我正在尝试通过Capture.captureAudio() 在 iOS 中录制音频。它输出的音频文件可以在计算机上读取,但在 iOS (iPhone 4S) 和 Android 上都无法读取。

ffmpeg -i 产生:

Input #0, caf, from 'myFile.m4a':
Duration: 00:00:07.04, start: 0.000000, bitrate: 37 kb/s
Stream #0:0: Audio: aac (aac  / 0x20636161), 16000 Hz, mono, s16, 23 kb/s

如果我通过 Voice Recorder 应用程序使用 iOS 录制文件,我会从 ffmpeg 获得:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Test.m4a':
Metadata:
major_brand     : M4A 
minor_version   : 0
compatible_brands: M4A mp42isom
creation_time   : 2017-04-03 19:01:32
date            : 2017-04-03T21:01:09+0200
encoder         : com.apple.VoiceMemos (iPhone OS 7.1.2)
Duration: 00:00:05.15, start: 0.000000, bitrate: 67 kb/s
Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, s16, 64 kb/s
  Metadata:
  creation_time   : 2017-04-03 19:01:32
  handler_name    : Core Media Audio

此文件可在 Android 和 iOS 上播放。

虽然乍一看 mime 类型似乎被限制为“amr”

    /**
 * Gets the available recording MimeTypes
 */ 
public String [] getAvailableRecordingMimeTypes(){
    return new String[]{"audio/amr"};
}

看一眼native code 会发现在 iOS 上它记录为“MPEG4AAC”16kHz。

为什么我得到一个无法在手机上播放的caf文件?

任何帮助表示赞赏!

【问题讨论】:

    标签: ios codenameone audio-recording


    【解决方案1】:

    caf 文件是Core Audio Format 文件。它们只是苹果用于其音频的包装器,因为它在存储“未包装”的音频方面具有一些优势。

    caf 包装器中的音频仍使用您指定的格式进行编码。由于它只是一个包装器,因此“解包”它应该快速且容易。 This google search for "convert caf to mp4" 显示了很多结果。如果您希望以编程方式执行此操作,则适当的 Google 搜索应该会产生大量结果。

    【讨论】:

    • 谢谢史蒂夫!事实上,CAF 有很多质量,但它在 Android 上不受支持。如果您将录音的 mime 类型(在 ios 设备上)更改为“audio/aac”而不是“audio/amr”,那么您将获得可在 iOS 和 Android 上播放的 mp4 文件(请参阅stackoverflow.com/a/43234291/6351897)。跨度>
    • 在最初开发此代码时,我们费了很大力气才能让它在所有操作系统上正常工作。我们最终决定使用应该得到普遍支持的 AMR,从历史上看,AAC 对于某些 Android 设备来说是有问题的。如果现在记录的是 CAF 而不是 AMR,那可能是回归
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 2012-06-22
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多