# 使用WebRTC进行Web视频会议 Web组件å¯ä»¥é€šè¿‡W3Cæ ‡å‡†å议接å£æ‹‰èµ·æ‘„åƒå¤´å’Œéº¦å…‹é£Žï¼Œé€šè¿‡[onPermissionRequest](../reference/apis-arkweb/ts-basic-components-web.md#onpermissionrequest9)接å£æŽ¥æ”¶æƒé™è¯·æ±‚通知,需在é…置文件ä¸å£°æ˜Žç›¸åº”的音频æƒé™ã€‚ - 使用摄åƒå¤´å’Œéº¦å…‹é£ŽåŠŸèƒ½å‰è¯·åœ¨module.json5ä¸æ·»åŠ 音频相关æƒé™ï¼Œæƒé™çš„æ·»åŠ æ–¹æ³•è¯·å‚考[在é…置文件ä¸å£°æ˜Žæƒé™](../security/AccessToken/declare-permissions.md)。 ``` "requestPermissions":[ { "name" : "ohos.permission.CAMERA" }, { "name" : "ohos.permission.MICROPHONE" } ] ``` 通过在JavaScriptä¸è°ƒç”¨W3Cæ ‡å‡†å议接å£navigator.mediaDevices.getUserMedia(),该接å£ç”¨äºŽæ‹‰èµ·æ‘„åƒå¤´å’Œéº¦å…‹é£Žã€‚constraintså‚数是一个包å«äº†videoå’Œaudio两个æˆå‘˜çš„MediaStreamConstraints对象,用于说明请求的媒体类型。 在下é¢çš„示例ä¸ï¼Œç‚¹å‡»å‰ç«¯é¡µé¢ä¸çš„开起摄åƒå¤´æŒ‰é’®å†ç‚¹å‡»onConfirm,打开摄åƒå¤´å’Œéº¦å…‹é£Žã€‚ - 应用侧代ç 。 ```ts // xxx.ets import { webview } from '@kit.ArkWeb'; import { BusinessError } from '@kit.BasicServicesKit'; import { abilityAccessCtrl } from '@kit.AbilityKit'; @Entry @Component struct WebComponent { controller: webview.WebviewController = new webview.WebviewController() aboutToAppear() { // é…ç½®Webå¼€å¯è°ƒè¯•æ¨¡å¼ webview.WebviewController.setWebDebuggingAccess(true); let atManager = abilityAccessCtrl.createAtManager(); atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.CAMERA', 'ohos.permission.MICROPHONE']) .then((data) => { console.info('data:' + JSON.stringify(data)); console.info('data permissions:' + data.permissions); console.info('data authResults:' + data.authResults); }).catch((error: BusinessError) => { console.error(`Failed to request permissions from user. Code is ${error.code}, message is ${error.message}`); }) } aboutToAppear() { // 获å–æƒé™è¯·æ±‚通知,点击onConfirm按钮åŽï¼Œæ‹‰èµ·æ‘„åƒå¤´å’Œéº¦å…‹é£Žã€‚ webview.WebviewController.setWebDebuggingAccess(true); let atManager = abilityAccessCtrl.createAtManager(); atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.CAMERA', 'ohos.permission.MICROPHONE']) .then(data => { let result: Array<number> = data.authResults; let hasPermissions1 = true; result.forEach(item => { if (item === -1) { hasPermissions1 = false; } }) if (hasPermissions1) { console.info("hasPermissions1"); } else { console.info(" not hasPermissions1"); } }).catch(() => { return; }); } build() { Column() { Web({ src: $rawfile('index.html'), controller: this.controller }) .onPermissionRequest((event) => { if (event) { AlertDialog.show({ title: 'title', message: 'text', primaryButton: { value: 'deny', action: () => { event.request.deny(); } }, secondaryButton: { value: 'onConfirm', action: () => { event.request.grant(event.request.getAccessibleResource()); } }, cancel: () => { event.request.deny(); } }) } }) } } } ``` - å‰ç«¯é¡µé¢index.html代ç 。 ```html <!-- index.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <video id="video" width="500px" height="500px" autoplay="autoplay"></video> <canvas id="canvas" width="500px" height="500px"></canvas> <br> <input type="button" title="HTML5æ‘„åƒå¤´" value="å¼€å¯æ‘„åƒå¤´" onclick="getMedia()"/> <script> function getMedia() { let constraints = { video: {width: 500, height: 500}, audio: true }; // 获å–videoæ‘„åƒå¤´åŒºåŸŸ let video = document.getElementById("video"); // 返回的Promise对象 let promise = navigator.mediaDevices.getUserMedia(constraints); // then()异æ¥ï¼Œè°ƒç”¨MediaStream对象作为å‚æ•° promise.then(function (MediaStream) { video.srcObject = MediaStream; video.play(); }); } </script> </body> </html> ```