日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

webrtc 入门第二章 音视频录制

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 webrtc 入门第二章 音视频录制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

webrtc 入門第二章 音視頻錄制

一、介紹

1、媒體錄制原理

? 在很多場景中回放音視頻資源的需求是非常重要的例如會議,直播授課等。任何媒體形式的表情都可進行錄制,如 ,,等。其中內容更加自由用戶的任何2d,3d操作都可以進行錄制和傳播。

? MediaRecoder 是控制媒體錄制的api,使用它可以進行錄制音視頻,使得web可以脫離服務器,獨立進行視頻錄制。同時W3C也制定了相應的web標準。錄制出來的是經過轉碼的標準媒體流數據。

二、實踐

1、錄制對象 MediaRecoder
var mediarecode=new MediaRecoder(stream,options)

1.stream:為通過getUserMedia方法獲取到的視頻流。同樣可已直接用 ,, 標簽直接獲取,這樣可以實現本地播放視頻錄制,繪畫板同步等。

2.options:為限制參數,具體如下

參數解釋
mimeType指定錄制的媒體類型(音頻、視頻)、編碼方式(audio/mpeg,audio/ogg,video/mp4)等
audioBitsPerSecond指定音頻比特率
videoBitsPerSecond指定視頻比特率
bitsPerSecond指定音視頻比特率,包含上面兩項

3.mediaRecoder的常用api方法和事件

名稱作用類型
MediaRecoder.start()開始錄制事件,timeslice為觸發ondataavailable事件方法
MediaRecoder.pause()停止錄制方法
MediaRecoder.resume()恢復錄制方法
MediaRecoder.isTypeSupported()判斷是否支持某個格式(有需求可以使用)方法
MediaRecoder.ondataavailable()當有錄制有有效數據是觸發該事件,在次方法里可以處理數據例如下載等事件
MediaRecoder.onerror()錄制出錯時觸發該事件,此時會停止錄制事件
2、錄制音頻
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/html"> <head><meta charset="UTF-8"><title>webrtc錄制聲音</title> </head> <body> <div class="app"><h1>聲音錄制<h1/><audio class="audio" controls autoplay></audio><hr/><input type="button" title="打開麥克風" value="打開麥克風" v-on:click="openAudio"/><input type="button" title="開始錄制" value="開始錄制" v-on:click="startRecode"/><input type="button" title="停止錄制" value="停止錄制" v-on:click="stopRecode"/><input type="button" title="播放" value="播放" v-on:click="play"/>{{/* <input type="button" title="下載" value="下載" v-on:click="download"/>*/}}<a :href="downloadUrl" download="test1.ogg" v-on:click="download"/>下載</a> </div> </body> <script src="/static/js/Vue.2.5.3.js"></script> <script type="text/javascript">let vm = new Vue({el: ".app",delimiters: ['{[', ']}'],data: {status: "",stream: null,mediaRecorder: null,recordedBlobs: [],audio: null,downloadUrl: ""},methods: {// 下載download: function () {const blob = new Blob(this.recordedBlobs, {"type": "audio/ogg"})this.downloadUrl = window.URL.createObjectURL(blob)//setTimeout(() => {// window.URL.revokeObjectURL(this.downloadUrl)// }, 100)// // 必須創建一個a標簽下載const a = document.createElement("a")a.style.display = "none"a.href = this.downloadUrla.download = "test.ogg"document.body.appendChild(a)a.click()// 移除a標簽setTimeout(() => {document.body.removeChild(a)}, 100)},// 開始錄制startRecode: function () {let that = this;if (that.status == "startRecode") {return}if (that.stream == null) {alert("請打開麥克風")return;}that.status = "startRecode"// 開始錄制let options = {"mineType": "audio/ogg;"}try {that.mediaRecorder = new MediaRecorder(that.stream, options)console.log(that.mediaRecorder)// 退出回調事件that.mediaRecorder.onstop = (event) => {console.log("錄制已停止")console.log(event)console.log(that.recordedBlobs)}// 錄制數據回調時間that.mediaRecorder.ondataavailable = that.ondataavailable// 錄制10sthat.mediaRecorder.start(10)} catch (e) {alert("錄制失敗", e)}},// 播放play: function () {const blob = new Blob(this.recordedBlobs, {"type": "audio/ogg"})this.audio = document.querySelector('audio');this.audio.src = window.URL.createObjectURL(blob)this.audio.play()},stopRecode: function () {this.mediaRecorder.stop()alert("停止錄制")},ondataavailable: function (event) {let that = this;if (event.data && event.data.size > 0) {console.log("recode data", event.data)// 收到數據后,導入本都錄制緩存that.recordedBlobs.push(event.data)}},openAudio: function () {if (navigator.getUserMedia) {window.audioContext = new AudioContext()navigator.getUserMedia({'audio': true}, this.onVoice, this.errorFunc); //success是獲取成功的回調函數} else {alert('Native device media streaming (getUserMedia) not supported in this browser.');}},errorFunc: function (e) {alert("tive device media streaming (getUserMedia) not supported in this browser")},onVoice: function (stream) {let that = this;console.log(stream)that.status = "start"that.stream = stream}},}) </script> </html>

音頻錄制的流程如下

1.打開麥克風:同樣使用getUserMedia()方法 約束條件’audio’: true , 即可請求麥克風。獲取到音頻流stream

2.錄制:使用MediaRecorder 接口開始錄制。在錄制過程中ondataavailable 回調方法將錄制到的音頻數據存入緩存中

3.播放:將音頻緩存的數據創建Blob 對象,然后使用audio標簽播放

4.下載:將音頻緩存的數據創建Blob 對象,然后window.URL.createObjectURL創建下載地址,使用a標簽進行下載

3、錄制視頻

錄制視頻的方式及流程和錄制音頻的過程時一樣的,唯一的區別就是在媒體流的格式

1.getUserMedia 約束項 constraints={video:{width:400,height:300}}

2.使用Blob創建視頻對象 options = {“mineType”: “video/webm”}

其余流程都一樣,本次不展示視頻錄制代碼

三、總結

本章介紹了關于包括音頻,視頻等媒體資源錄制,其流程其實很簡單,使用到的api也不多,直接看代碼都就可以操作,需要注意的如下

1.關于媒體設備的支持性和兼容性,不同瀏覽器版本對api的支持上可能不同

2.需要注意在錄制過程中的使用參數,不同的應用場景對使用的參數可能會有差別

3.錄制canvas 需要查看如何獲取canvas的流媒體可以查看 canvas.captureStream api,該方法可以獲得canvas的流媒體,然后可以做一些同步播放或者錄制等功能,和音視頻操作一樣。

四、感謝

感謝作者 亢少軍老師的 《WebRTC音視頻開發 》 課本 第七章 媒體錄制 的指導

總結

以上是生活随笔為你收集整理的webrtc 入门第二章 音视频录制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。