Mrcdh技术博客 Mrcdh技术博客
首页
  • Html5
  • Javascript
  • Nodejs
  • electron
  • Android
  • 微信公众号
  • 框架
  • 其他
  • Mysql
  • PHP
  • Python
  • java
  • Gulp
  • 其它
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Mrcdh

全栈开发小学生
首页
  • Html5
  • Javascript
  • Nodejs
  • electron
  • Android
  • 微信公众号
  • 框架
  • 其他
  • Mysql
  • PHP
  • Python
  • java
  • Gulp
  • 其它
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Html5

    • 使用频繁的网页元信息
    • input file 上传文件指定文件类型
    • Less和Scss语法对比
    • HTTP常见响应码
    • iframe常用操作
    • h5操作媒体设备(音频和视频)
      • 录制音频
    • canvas的基本使用
    • 手机网页自适应
    • 常用CSS
    • CSS布局-多列布局
    • scss使用常见问题
  • JavaScript

  • Nodejs

  • express

  • electron

  • Android

  • 微信公众号

  • 框架

  • 其他

  • selenium

  • Sequelize

  • 大前端
  • Html5
mrcdh
2022-07-21
目录

h5操作媒体设备(音频和视频)


// 访问用户媒体设备的兼容方法
function getUserMedia(constraints, success, error){
    if(navigator.mediaDevices.getUserMedia){
        // 最新的标准API
        navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error)
    }else if(navigator.webkitGetUserMedia){
        // Webkit 核心浏览器
        navigator.webkitGetUserMedia(constraints, success, error)
    }else if(navigator.mozGetUserMedia){
        // Firefox 核心浏览器
        navigator.mozGetUserMedia(constraints, success, error)
    }else if(navigator.getUserMedia) {
        // 旧版API
        navigator.getUserMedia(constraints, success, error)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • constraints: 请求指定的媒体类型,主要包含video和audio
    • 不带任何参数: {video: true, audio: true}
    • 指定视频分辨率: {video: {width: 640, height: 320}}
    • 移动设备上指定摄像头:前置{video: {facingMode: 'user'}},后置{video: {facingMode: {exact: 'enviroment'}}}
  • success: 成功回调函数,参数为MediaStream对象,表示媒体内容的数据流,可以通过URL.createObjectURL转换后设置给video和audio的src属性,新版浏览器也可以直接赋值给srcObject属性

案例

<video id="video" autoplay style="width: 480px;height: 320px;"></video>
<p>
    <button onclick="onCapture()" class="btn btn-primary">拍照</button>
</p>
<canvas id="canvas" width="480" height="320"></canvas>
<script>
const video = document.getElementById('video')
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')

        
navigator.mediaDevices.getUserMedia({video: true, audio:true}).then(res => {
    const CompatibleURL = window.URL || window.webkitURL
    // video.src = CompatibleURL.createObjectURL(res)
    video.srcObject = res // 新版浏览器不支持使用 createObjectURL 的形式,可以做兼容处理
    video.play()
}).catch(e => {
    alert(e.message)
})

function onCapture(){
    ctx.drawImage(video, 0,0,480,320)
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 录制音频

<script>
let chunks: BlobPart[] = []
navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
  mediaRecorder = new MediaRecorder(stream);
  mediaRecorder.addEventListener("dataavailable", handleDataAvailable);

  // 录音结束后,合并所有片段并发送
  mediaRecorder.addEventListener('stop', () => {
    const blob = new Blob(chunks, { type: 'audio/webm;codecs=opus' }); // 格式可能因实际需求而变化
    const file = new File([blob], "recording.webm", { type: 'audio/webm' });
    const formData = new FormData()
    formData.append('file', file)
    uploadOss(formData).then((res) => {
      const url = res.data.url
      console.log('audio', url)
    })
    chunks = [];
  });
});

// 处理录音片段
function handleDataAvailable(event:any) {
  if (event.data.size > 0) {
    chunks.push(event.data);
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#html
上次更新: 2024/05/23, 16:25:31
iframe常用操作
canvas的基本使用

← iframe常用操作 canvas的基本使用→

最近更新
01
uniapp常见问题
03-19
02
Vue3项目搭建
12-25
03
使用pnpm的monorepo组织项目
11-01
更多文章>
Theme by Vdoing | Copyright © 2020-2025 Mrcdh | 苏ICP备2020058908号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×