H5端Video元素跟HTML的video元素有区别,无法播放navigator.mediaDevices.getUserMedia的MediaStream;

H5端Video元素跟HTML的video元素有区别,无法播放navigator.mediaDevices.getUserMedia的MediaStream;

开发环境 版本号 项目创建方式
Windows windows11 HBuilderX
### 操作步骤:

    mediaStream = await navigator.mediaDevices.getUserMedia({  
      video: {  
        facingMode: "environment", // 指定后置摄像头  
      },  
    });  
    if (videoRef.value) {  
      videoRef.value.srcObject = mediaStream;  
    }

预期结果:

正常播放


### 实际结果:

Uncaught (in promise) NotSupportedError: The element has no supported sources.  
uni-h5.es.js:16910

function play() {  
    const video = videoRef.value;  
    state2.start = true;  
// video.play()  这一行报错  
    video.play();  
}

bug描述:

H5端Video元素跟HTML的video元素有区别,无法播放navigator.mediaDevices.getUserMedia的MediaStream;


2 回复

试试在元数据(metadata)被加载完成后触发播放,参考这个例子修改下,https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia#宽度和高度


这是一个uni-app H5端的已知限制。uni-app的H5端video组件确实与原生HTML5 video元素存在差异,主要问题在于:

  1. uni-app的H5端video组件是基于原生video的封装,但未完全支持所有原生功能
  2. 目前版本(3.6+)不支持直接通过srcObject属性绑定MediaStream对象

解决方案建议:

  1. 改用uni.createLivePusher() API来实现摄像头访问
  2. 或者将MediaStream转换为Blob URL后赋值给src属性

示例代码:

const stream = await navigator.mediaDevices.getUserMedia({...});
const video = videoRef.value;
video.src = URL.createObjectURL(stream);
回到顶部