【问题标题】:Is it possible to record audio in iOS with Codename One?是否可以在 iOS 中使用 Codename One 录制音频?
【发布时间】:2017-08-28 19:52:58
【问题描述】:

我的应用有一个按钮来录制音频(还有一个按钮可以在录制结束时播放它)。我在服务器上发送录制的音频文件。在 Android 上,文件被记录为 .amr(mime 类型的音频/amr)并且可以播放。

但在 iOS 上,该文件既不能在设备(iPhone 4 或 4S)上播放,也不能在电脑上播放。 ffmpeg -i 举报

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x2fac120] moov atom not found
9gMjOnnmsj9JJZR3.m4a: Invalid data found when processing input

请注意,VLC 也无法播放。

我提供 m4a 扩展名,因为录音机使用它(以及 aac 编解码器)。

这是我使用的代码(主要基于https://github.com/codenameone/CodenameOne/blob/master/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java#L2768-L2794):

audioMemoPath = ParametresGeneraux.getWRITABLE_DIR() + "AudioMemo-"
            + System.currentTimeMillis() + 
            (Display.getInstance().getPlatformName().equals("and")
            ? ".amr"
            : ".m4a");
audioMemoMimeType = MediaManager.getAvailableRecordingMimeTypes()[0];

audioMemoRecorder = MediaManager.createMediaRecorder(audioMemoPath, audioMemoMimeType);

// If the permission audio has not been granted 
// the audiomemorecoreder will be null
     if (audioMemoRecorder != null) {
           audioMemoRecorder.play();
           boolean b = Dialog.show("Recording", "", "Save", "Cancel");
           audioMemoRecorder.pause();
           audioMemoRecorder.cleanup();

            ...
        }

此外,如果我在 iOS 上显示可用的 mime 类型,它会产生“audio/amr”,根据我能读到的所有帖子,我对此表示怀疑,这些帖子告诉你 amr 在 iOS 上不受支持。查看源代码,amr 似乎是默认的 mime 类型,因为它总是被返回:

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

所以我的问题是:是否可以在 iOS 上录制音频,如果可以,怎么做?

任何帮助表示赞赏,

【问题讨论】:

    标签: codenameone audio-recording


    【解决方案1】:

    你看过 Capture 类吗?这似乎更直接。

    https://www.codenameone.com/javadoc/index.html

    【讨论】:

    【解决方案2】:

    好的,我通过重载MediaManager 的一些方法(即getAvailableRecordingMimeTypes()createMediaRecorder() 来阻止它使用其getAvailableRecordingMimeTypes 方法)让它工作。

    这里是 getAvailableRecordingMimeTypes() 的代码:

        /**
     * Normally the method returns amr even for ios. So we overload the original
     * method to return aac on ios.
     * @return 
     */
    public static String[] getAvailableRecordingMimeTypes() {
        if (Display.getInstance().getPlatformName().equals("ios")) {
            return new String[]{"audio/aac"};
        } else {
            return new String[]{"audio/amr"};
        }
    
    }
    

    createMediaRecorder() 保持原样(复制时没有更改)。

    现在可以在 iOS 中录制音频并在 iOS 和 Android 中播放!

    【讨论】:

    • 由于我遇到了同样的问题,我尝试了您的解决方案 - 但是这些文件仍然无法在其他设备上播放。我创建了一个自定义 MediaManager,扩展了代号并进行了您提出的更改。最后它就像直接调用'Display.getInstance().createMediaRecorder(path,“audio/aac”)'......你能给我提供更多关于解决方案的细节吗?
    • 我已经一年了!现在在 Android 上我也使用音频/aac 并且它可以工作。您是否检查过您是否真的在调用您的 getAvailableRecordingMimeTypes 方法?我一开始犯了错误,是从 MediaManager 调用的。
    • 我刚刚想通了:文件的两边都必须有 .m4a 扩展名,然后它适用于所有人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多