如何在phonegap应用程序中传输音频

时间:2015-05-05 04:56:10

标签: cordova ionic peerjs

我正在尝试在我正在创建的phonegap应用中实现音频调用。我正在使用PeerJS来连接2个客户端。这部分正在运作。但问题在于为媒体流创建的URL。它看起来像这样:

<audio src="blob:file%3A///6212fd77-7d1e-46ba-9abe-cfe96d414b28"></audio>

而不是像:

<audio src="blob:http%3A///url-to-server.com/6212fd77-7d1e-46ba-9abe-cfe96d414b28"></audio>

这就是为什么两台设备都没有听到任何声音(我正在使用genymotion和我的智能手机进行测试)。

但奇怪的是,当我在浏览器和手机中进行测试时,它可以正常工作。当我在笔记本电脑中使用内置麦克风讲话时,我会在手机上听到它。但是当我用手机说话时,我的笔记本电脑上什么也听不到。

作为参考,当我选择播放媒体流的音频元素时,这就是我所得到的:

<audio src="blob:http%3A//localhost%3A8100/861180b2-2c12-4134-a6da-89fcb40ef372"></audio>

不确定这是否真的是问题。

我正在使用ionic来开发应用程序,并且它与crosswalk顺利集成,基本上只是将最近的Chrome浏览器与您的应用程序打包在一起,以便它可以毫无问题地使用闪亮的新东西。

以下是请求麦克风的代码:

function getAudio(successCallback, errorCallback){
    navigator.getUserMedia({
        audio: true,
        video: false
    }, successCallback, errorCallback);
}

然后每当有人发起呼叫时我都会打电话:

getAudio(
    function(MediaStream){

        console.log('now calling ' + to);
        var call = peer.call(to, MediaStream);
        call.on('stream', onReceiveStream);
});

然后onReceiveStream将媒体流转换为URL,然后将其分配给音频元素:

function onReceiveStream(stream){
    var audio = document.querySelector('audio');
    audio.src = window.URL.createObjectURL(stream);
    audio.onloadedmetadata = function(e){
        console.log('now playing the audio');
        audio.play();
    }
}

有什么想法吗?提前谢谢。

更新

似乎真正的问题是无法从手机捕获音频,因为在调用navigator.getUserMedia时它不会请求访问麦克风。我确认在使用genymotion进行测试时可以访问navigator.getUserMedia。虽然它也没有要求在genymotion中访问。我正在使用recordRTC作为垫片提供者。

更新2

好吧,我放弃了这个。它真的不可能要求麦克风。我现在正在尝试的是PhoneRTC。但我再次陷入困境。我安装插件时它没有建立。有关更多详细信息,请在项目Github页面上查看此问题: https://github.com/alongubkin/phonertc/issues/151

1 个答案:

答案 0 :(得分:2)

要访问手机资源,您必须在AndroidManifest.xml上声明它,以便最终用户在安装应用时知道它。

Cordova和/或Phongap插件构建了一个应用程序,即使您没有将它们用作webview库,因此您必须在清单中请求权限。

对于麦克风和相机,权限为:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

但似乎有些插件也有一些技巧,还需要一个:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />