【问题标题】:Record and play simultaneously on iOS (Phonegap build)在 iOS 上同时录制和播放(Phonegap 版本)
【发布时间】:2014-04-23 13:33:47
【问题描述】:

我正在使用 Phonegap Build 3.3.0 版开发 iOS 和 Android 应用程序。

应用程序的主要焦点是在后台播放另一个音频/音乐的录音。

对于这两种情况,我都在使用具有正确音频文件的 phonegap 媒体 api,用于录制(iOs - *.wav / Android - *.amr)和播放(iOs 和 Android - *.mp3)。

示例:

var audioRec = new Media(audioRecSrc, onSuccess, onError);
audioRec.startRecord();

var audioPlay = new Media(audioPlaySrc, onSuccess, onError);
audioPlay.play();

示例在 Android 上运行没有任何问题。声音被录制并正常播放音乐。但在 iOS 中只有一个是可能的。无论最后调用哪个,播放或录制。另一个返回错误代码 - 4

这是 iO 上 Phonegap Media API 的限制还是我遗漏了什么?

【问题讨论】:

  • 我相信这本身就是一个 iOS 限制。我不确定,因为我不是一个巨大的苹果开发者,但即使尝试在 iPad 上播放音乐的车库乐队中录制也会迫使音乐停止。 iPad 上的 Skype 会话也会发生同样的情况。
  • 我不认为这是 iOS 的限制,因为我在 iOS 上玩原生(非 phonegap)音乐游戏(StarComposer - URL:itunes.apple.com/si/app/starcomposer/id670221315?mt=8),这也是可能的。当然使用耳机,但尽管如此。
  • 嗯,也许答案确实取决于耳机。我记得在某处读到 iOS 一次只做 1 个音频源的原因是为了不记录背景声音。因此暗示它大声播放。用耳机试试你的应用,看看它是否有所作为
  • 我在这里发布问题之前这样做了,但没有任何区别。 ://
  • 有这方面的消息吗?你解决了吗?

标签: javascript ios audio record phonegap-build


【解决方案1】:

为了能够同时播放媒体和录制音频,必须将 AVAudioSession 的类别属性设置为 AVAudioSessionCategoryPlayAndRecord。为此,您必须部署一个设置相应值的自定义 iOS 插件。

目前来说,由于 Cordova 媒体插件中的一个错误,这个过程并不是很简单。在开始录制之前,插件将AVAudioSession的类别设置为AVAudioSessionCategoryRecord。因此,在开始录制后,播放所需媒体变得不可能,除非您在调用录制方法后明确地将 AVAudioSession 类别设置为播放和录制。这清楚地暗示您只能在录制开始之后播放媒体。

但是,这种解决方法在许多情况下可能是不可接受的,这可能需要在录制声音之前开始播放媒体。因此,我已经提交了关于该问题的错误报告,您可以在此处找到:

iOS Media plugin: cannot play video and record audio simultaneously

另外,我已经应用了修复并执行了以下拉取请求:

Check if avSession.category is already set to "AVAudioSessionCategoryPlayAndRecord" before recording

这确实是一个小修复(字面意思是两行代码),因此我相信它很快就会应用于 master 分支。

【讨论】:

  • 根据您的发现,我尝试使用低延迟音频插件找到解决方法,该插件使用 AudioToolbox 框架中的声音服务而不是 AVAudio。我使用上述插件的函数 preloadFX 加载了音频文件,并使用使用 AVAudio 的标准媒体类进行录制。尽管如此,尝试也没有成功,只有媒体类录制工作,低延迟音频没有播放没有任何错误。基于此(两个不同系统音频播放器的组合没有帮助),我不确定更改 AVAudioSession 的类别属性是否真的有帮助。
  • 其实你提到的插件的Objective-C代码是依赖于AVFoundation的。因此,似乎很清楚底层机制绑定到 AVAudioSession 实例。尽管如此,我的理论在发帖前已经得到证实,因为我目前正在做一个需要同时播放 Html5 视频和录制音频的项目。
  • 我不知道 LLA 插件在使用 AudioToolbox 框架中的声音服务时也依赖于 AV。我想这是正确的答案。谢谢分享:)
【解决方案2】:

更新

经过进一步调查,我可能错了。根据Cordova Media API documentation,在 iOS 中录制音频时,您要录制的文件必须已经存在并且是 .wav 文件。也许你已经尝试过了(在这种情况下,我之前的回答可能是正确的)但是这里有一个简单的脚本来创建文件,然后在文件句柄准备好后开始录制:

var audioRecSrc = "myrecording.wav";
var audioPlaySrc = "audiotoplay.mp3"

// Wait for PhoneGap to load
document.addEventListener("deviceready", onDeviceReady, false);

// PhoneGap is ready
function onDeviceReady() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);
}

function gotFS(fileSystem) {
    fileSystem.root.getFile(audioRecSrc, {create: true, exclusive: false}, gotFileEntry, fail);
}

function gotFileEntry(fileEntry) {
    var audioRec = new Media(audioRecSrc, onSuccess, onError);
    audioRec.startRecord();

    var audioPlay = new Media(audioPlaySrc, onSuccess, onError);
    audioPlay.play();
}

function fail(error) {
    console.log("error : " + error.code);
}

这是Cordova File API documentation 的链接,以供您参考。您还需要确保您在应用配置中拥有适当的权限以使用文件和媒体 API(您需要的一切都在我链接的页面上)


上一页

这是 iOS 的限制。这是来自 Mobile Safari 文档的引用(PhoneGap 在使用 iPhone SDK 编译时使用本机 UIWebView):

多个同时的音频或视频流

目前,所有运行 iOS 的设备都仅限于播放单个 音频或视频流随时。并排播放多个视频 侧边、部分重叠或完全重叠——目前没有 在 iOS 设备上支持。播放多个同时的音频流 也不支持。您可以更改音频或视频源 然而,动态的。请参阅“按顺序更换媒体源” (第 41 页)了解详情

可以推断,如果无法同时播放两个流,则两者都不会同时播放和录制。至于上面关于 StarComposer 应用程序的评论,原生 iPhone 应用程序和使用 PhoneGap 的应用程序之间存在很大差异。 PhoneGap 使用 Cordova 允许开发人员使用 JavaScript 访问本机设备功能的子集,而本机应用程序具有全部功能。您遇到的流媒体功能有限是由于 iOS 平台上的 HTML5 实现所致。这是我引用上述引文的文件,位于第 23 页:

https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Using_HTML5_Audio_Video.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2017-07-24
    • 2011-07-05
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多