在iOS上同时录制和播放(Phonegap build)

时间:2014-04-23 13:33:48

标签: javascript ios audio record phonegap-build

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

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

对于这两种情况,我都使用带有正确音频文件的phonegap media 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

在iOs上是否存在Phonegap Media API的限制,还是我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

在讲的时候,由于Cordova Media Plugin中的一个错误,这个过程并不是那么简单。在开始录制之前,插件会不加选择地将AVAudioSession的类别设置为 AVAudioSessionCategoryRecord 。因此,在开始录制之后,播放所需的媒体变得不可能,除非您在调用记录方法后明确将AVAudioSession类别设置为播放和录制。这显然暗示您只能播放媒体, 录制开始后。

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

iOS Media plugin: cannot play video and record audio simultaneously

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

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

这实际上是一个小修复(实际上是两行代码),因此我相信它很快会应用到主分支。

答案 1 :(得分:0)

<强>更新

经过进一步调查,我可能错了。根据{{​​3}},在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 Media API documentation的链接,以防您需要引用它。您还需要确保在应用配置中拥有适当的权限才能使用文件和媒体API(您需要的所有内容都在我链接的页面上)


上一页

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

  

多个同步音频或视频流

     

目前,运行iOS的所有设备仅限于播放单个设备   音频或视频流随时可用。播放多个视频端   边,部分重叠或完全覆盖 - 目前不是   iOS设备支持。播放多个同步音频流   也不受支持。您可以更改音频或视频源   然而,动态地。请参阅“按顺序更换媒体源”   (第41页)了解详情

推断如果不能同时播放两个流是有意义的,那么同时播放和录制也不会。至于上面关于StarComposer应用程序的评论,本机iPhone应用程序与使用PhoneGap的应用程序之间存在很大差异。 PhoneGap使用Cordova允许开发人员使用JavaScript访问本机设备功能的子集,而本机应用程序具有全部功能。您遇到的有限流媒体功能是由iOS平台上的HTML5实现引起的。这是我从上面引用的文档,它来自第23页:

Cordova File API documentation