【问题标题】:Is it possible with Codename One to record microphone input and play it back simultaneously?Codename One 是否可以录制麦克风输入并同时播放?
【发布时间】:2016-11-07 12:35:47
【问题描述】:

我正在使用 Codename One 来记录麦克风输入并将其回放到连接的耳机。

首先,如果我将麦克风中的音频录制到文件中,并在录制结束时播放,它会按预期工作。这就是为什么基于这个2014 question我实现了2个周期性任务(timer和timertask),只要2个文件:一个用于录制,一个用于播放。我将周期性任务周期设置为 100 毫秒到几秒之间的值,但结果在 Android 设备上很糟糕。确实有随机的缝隙,一点都不流畅,也不好理解。

我假设每个周期写入文件的开销太高,因此会导致这种行为。所以using proper high-level Codename One methods 似乎并不可行。

然后在 2014 年的同一个问题中,请求者建议从录制媒体创建一个输入流,并将其用作播放媒体的输入。然而,MediaManager.createMediaRecorderStream() 方法似乎不再可用。我尝试使用用于通过fs.openInputStream(recFilepath) 将用于播放媒体的音频录制为 InputStream 的文件,但它没有在设备上输出任何声音或错误。

所以我的问题是我是否可以使用纯代号一实现我的目标,还是我必须使用本机界面?此外,Shai(在 2014 年上述问题中)写道,MediaManager.createMediaRecorderStream() 的第二种方法可能适用于某些平台:其中是 android 平台,还是仅针对 iOS 平台?

任何帮助表示感谢并抱歉没有发布代码,因为我在尝试似乎不起作用时立即清除它。所以我真的搞砸了我的代码,现在它没有做我最初的目标。

干杯,

【问题讨论】:

    标签: mobile codenameone audio-recording


    【解决方案1】:

    据我回忆,当时的 Android 不支持媒体输入流,后来只允许将输入直接捕获为未压缩的 WAV,这使得全双工使用不切实际。这可能已经改变,因为我记得他们对媒体库进行了一些大修。

    我不确定这是否在我们的更高级别代码中公开。除了使用本机接口之外,您还可以通过分叉和破解它来帮助我们改进 Codename One,例如这是Android项目中的相关代码:

    https://github.com/codenameone/CodenameOne/blob/master/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java#L2804-L2858

    这是 Codename One 的贡献指南,它涵盖了在模拟器中的运行,但这是一个好的开始:https://www.codenameone.com/blog/how-to-use-the-codename-one-sources.html

    您可以使用此处的说明在 Android 设备上测试您的更改:https://www.codenameone.com/blog/debug-a-codename-one-app-on-an-android-device.html

    【讨论】:

    • 感谢@Shai 的输入。确实可以通过本机界面(至少对于Android)。如何做到这一点在my other SO question 中有描述。延迟是可察觉的,但结果实际上很棒。关于贡献,您的意思是(重新)创建一个 createMediaRecorderStream() 方法,该方法返回一个可供 createMedia() 使用的 Stream 或创建一个直接将麦克风输入播放到扬声器的方法?
    • 是的,如果您认为我们可以改进我们的 API 实现中使用的 Android 原生方法,您可以直接 fork 项目并提供更好的原生 Android createMediaRecorderStream 实现
    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多