今天,做了一个通过Webrtc接口枚举音频设备的测试代码,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebRTC获取音视频设备</title>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<style>
.dev-item {
height: 28px;
}
.dev-row {
padding: 6px 10px;
height: 28px;
}
</style>
</head>
<body>
<div class="dev-row">
<label>音频输入设备</label>
<select class="dev-item" id="audio_input"></select>
</div>
<div class="dev-row">
<label>视频输入设备</label>
<select class="dev-item" id="video_input"></select>
</div>
<div class="dev-row">
<label>音频输出设备</label>
<select class="dev-item" id="audio_output"></select>
</div>
<div class="dev-row" style="display:none" id="video-output-row">
<label>视频输出设备</label>
<select class="dev-item" id="video_output"></select>
</div
</body>
</html>
<script>
'use strict'
var audioInput = document.querySelector("select#audio_input");
var videoInput = document.querySelector("select#video_input");
var audioOutput = document.querySelector("select#audio_output");
var videoOutput = document.querySelector("select#video_output");
var videoOutputRow = document.querySelector("#video-output-row");
function HandleError(err) {
console.log(err.name + "," + err.message);
alert(err.name + "," + err.message);
}
function GetStream(stream) {
return navigator.mediaDevices.enumerateDevices();
}
function GetDevices(deviceInfos) {
deviceInfos.forEach(function(deviceInfo) {
var option = document.createElement("option");
option.value = deviceInfo.deviceId;
if (deviceInfo.kind === "audioinput") {
option.text = deviceInfo.label || `Microphone ${audioInput.length + 1}`;
audioInput.appendChild(option);
} else if (deviceInfo.kind === "videoinput") {
option.text = deviceInfo.label || `Video Input ${videoInput.length + 1}`;
videoInput.appendChild(option);
} else if (deviceInfo.kind === "audiooutput") {
option.text = deviceInfo.label || `Audio Output ${audioOutput.length + 1}`;
audioOutput.appendChild(option);
} else if (deviceInfo.kind === "videooutput") {
option.text = deviceInfo.label || `Video Output ${videoOutput.length + 1}`;
videoOutput.appendChild(option);
videoOutputRow.style.display = 'block';
} else {
console.log("unknown device kind");
}
});
}
if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
console.log('enumerateDevices is not supported!');
} else {
navigator.mediaDevices.getUserMedia({audio: true, video: true})
.then(GetStream)
.then(GetDevices)
.catch(HandleError);
}
</script>
这个代码在 Chrome里测试正常,但在Android的WebView里却报错,报的错误名为 NotReadableError, 错误描述为:Could not start audio source。通过查阅相关资料,发现解决问题的方式如下:
在App的AndroidManifest.xml 里添加如下信息:
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>
解决android调用录音不成功,h5录音权限问题android NotReadableError: Could not start audio source.
这两个都需要授权,h5页面的 navigator.mediaDevices.getUserMedia 才能调起录音功能
android.permission.RECORD_AUDIO
允许程序录制音频(Allows an application to record audio)
android.permission.MODIFY_AUDIO_SETTINGS
允许程序修改全局音频设置(Allows an application to modify global audio settings)