Ngc007 2022-12-12 09:23 采纳率: 0%
浏览 155
已结题

使用webRTC API getUserMedia播放电脑本地USB连接的高清扫描仪、高清摄像头,播放的视频流不高清。顶多是标清

使用webRTC API getUserMedia播放电脑本地USB连接的高清扫描仪、高清摄像头,播放的视频流不高清。顶多是标清
本地USB连接的高清扫描仪、高清摄像头,通过webRTC API getUserMedia函数调用摄像头并播放流媒体,但是视频播放出来不是高清的
用的是webRTC API 提供的例子,并修改了video参数为width: 1920, height: 1080,frameRate:20,aspectRatio:1.78
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="description" content="WebRTC code samples">
    <meta name="viewport" content="width=device-width, user-scalable=yes, initial-scale=1, maximum-scale=1">
    <meta itemprop="description" content="Client-side WebRTC code samples">
    <meta itemprop="name" content="WebRTC code samples">
    <meta name="mobile-web-app-capable" content="yes">
    <meta id="theme-color" name="theme-color" content="#ffffff">
    <base target="_blank">
    <title>MediaStream Recording</title>
</head>
<body>
<div id="container">
    <h1>
        <span>WebRTC实例-媒体录制器</span></h1>
    <video id="gum" playsinline autoplay muted></video>
    <video id="recorded" playsinline loop></video>
    <div>
        <button id="start">打开摄像头</button>
        <button id="record" disabled class="off">开始录像</button>
        <button id="play" disabled>播放</button>
        <button id="download" disabled>下载</button>
    </div>
    <div>
        <h4>媒体流约束选项:</h4>
        <p>消除回声: <input type="checkbox" id="echoCancellation"></p>
    </div>
    <div>
        <span id="errorMsg"></span>
    </div>
</div>
<script async>
'use strict';
const mediaSource = new MediaSource();
mediaSource.addEventListener('sourceopen', handleSourceOpen, false);
let mediaRecorder;
let recordedBlobs;
let sourceBuffer;
const errorMsgElement = document.querySelector('span#errorMsg');
const recordedVideo = document.querySelector('video#recorded');
const recordButton = document.querySelector('button#record');
recordButton.addEventListener('click', () => {
    if (recordButton.className === 'off') {
    startRecording();
  } else {
    stopRecording();
    recordButton.textContent = '开始录像';
    recordButton.className = 'off';
    playButton.disabled = false;
    downloadButton.disabled = false;
  }
});
const playButton = document.querySelector('button#play');
playButton.addEventListener('click', () => {
  const superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
  recordedVideo.src = null;
  recordedVideo.srcObject = null;
  recordedVideo.src = window.URL.createObjectURL(superBuffer);
  recordedVideo.controls = true;
  recordedVideo.play();
});
const downloadButton = document.querySelector('button#download');
downloadButton.addEventListener('click', () => {
  const blob = new Blob(recordedBlobs, {type: 'video/webm'});
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.style.display = 'none';
  a.href = url;
  a.download = 'test.webm';
  document.body.appendChild(a);
  a.click();
  setTimeout(() => {
    document.body.removeChild(a);
    window.URL.revokeObjectURL(url);
  }, 100);
});
function handleSourceOpen(event) {
  console.log('MediaSource opened');
  sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"');
  console.log('Source buffer: ', sourceBuffer);
}
function handleDataAvailable(event) {
  if (event.data && event.data.size > 0) {
    recordedBlobs.push(event.data);
  }
}
function startRecording() {
  recordedBlobs = [];
  let options = {audioBitsPerSecond: 128000,videoBitsPerSecond: 2500000,mimeType: 'video/webm;codecs=VP8'};
  if (!MediaRecorder.isTypeSupported(options.mimeType)) {
    console.error(`${options.mimeType} is not Supported`);
    errorMsgElement.innerHTML = `${options.mimeType} is not Supported`;
    options = {mimeType: 'video/webm;codecs=vp8'};
    if (!MediaRecorder.isTypeSupported(options.mimeType)) {
      console.error(`${options.mimeType} is not Supported`);
      errorMsgElement.innerHTML = `${options.mimeType} is not Supported`;
      options = {mimeType: 'video/webm'};
      if (!MediaRecorder.isTypeSupported(options.mimeType)) {
        console.error(`${options.mimeType} is not Supported`);
        errorMsgElement.innerHTML = `${options.mimeType} is not Supported`;
        options = {mimeType: ''};
      }
    }
  }
  try {
    mediaRecorder = new MediaRecorder(window.stream, options);
  } catch (e) {
    console.error('Exception while creating MediaRecorder:', e);
    errorMsgElement.innerHTML = `Exception while creating MediaRecorder: ${JSON.stringify(e)}`;
    return;
  }
  console.log('Created MediaRecorder', mediaRecorder, 'with options', options);
  recordButton.textContent = '停止录像';
  recordButton.className = 'on';
  playButton.disabled = true;
  downloadButton.disabled = true;
  mediaRecorder.onstop = (event) => {
    console.log('Recorder stopped: ', event);
  };
  mediaRecorder.ondataavailable = handleDataAvailable;
  mediaRecorder.start(10); // collect 10ms of data
  console.log('MediaRecorder started', mediaRecorder);
}
function stopRecording() {
  mediaRecorder.stop();
  console.log('Recorded Blobs: ', recordedBlobs);
}
function handleSuccess(stream) {
  recordButton.disabled = false;
  console.log('getUserMedia() got stream:', stream);
  window.stream = stream;
  const gumVideo = document.querySelector('video#gum');
  gumVideo.srcObject = stream;
}
async function init(constraints) {
  try {
    const stream = await navigator.mediaDevices.getUserMedia(constraints);
    handleSuccess(stream);
  } catch (e) {
    console.error('navigator.getUserMedia error:', e);
    errorMsgElement.innerHTML = `navigator.getUserMedia error:${e.toString()}`;
  }
}
document.querySelector('button#start').addEventListener('click', async () => {
  const hasEchoCancellation = document.querySelector('#echoCancellation').checked;
  const constraints = {
    audio: false,
    video: {
      width: 1920, height: 1080,frameRate:20,aspectRatio:1.78
    }
  };
  console.log('Using media constraints:', constraints);
  await init(constraints);
});
</script>
<style>
 .hidden {
  display: none;
}
.highlight {
  background-color: #eee;
  font-size: 1.2em;
  margin: 0 0 30px 0;
  padding: 0.2em 1.5em;
}
.warning {
  color: red;
  font-weight: 400;
}
@media screen and (min-width: 1000px) {
  /* hack! to detect non-touch devices */
  div#links a {
    line-height: 0.8em;
  }
}
audio {
  max-width: 100%;
}
body {
  font-family: 'Roboto', sans-serif;
  font-weight: 300;
  margin: 0;
  padding: 1em;
  word-break: break-word;
}
button {
  background-color: #d84a38;
  border: none;
  border-radius: 2px;
  color: white;
  font-family: 'Roboto', sans-serif;
  font-size: 0.8em;
  margin: 0 0 1em 0;
  padding: 0.5em 0.7em 0.6em 0.7em;
}
button:active {
  background-color: #2fcf5f;
}
button:hover {
  background-color: #cf402f;
}
button[disabled] {
  color: #ccc;
}
button[disabled]:hover {
  background-color: #d84a38;
}
canvas {
  background-color: #ccc;
  max-width: 100%;
  width: 100%;
}
code {
  font-family: 'Roboto', sans-serif;
  font-weight: 400;
}
div#container {
  margin: 0 auto 0 auto;
  max-width: 60em;
  padding: 1em 1.5em 1.3em 1.5em;
}
div#links {
  padding: 0.5em 0 0 0;
}
h1 {
  border-bottom: 1px solid #ccc;
  font-family: 'Roboto', sans-serif;
  font-weight: 500;
  margin: 0 0 0.8em 0;
  padding: 0 0 0.2em 0;
}

h2 {
  color: #444;
  font-weight: 500;
}

h3 {
  border-top: 1px solid #eee;
  color: #666;
  font-weight: 500;
  margin: 10px 0 10px 0;
  white-space: nowrap;
}
li {
  margin: 0 0 0.4em 0;
}
html {
  overflow-y: scroll;
}
img {
  border: none;
  max-width: 100%;
}
input[type=radio] {
  position: relative;
  top: -1px;
}
p#data {
  border-top: 1px dotted #666;
  font-family: Courier New, monospace;
  line-height: 1.3em;
  max-height: 1000px;
  overflow-y: auto;
  padding: 1em 0 0 0;
}
section p:last-of-type {
  margin: 0;
}
section {
  border-bottom: 1px solid #eee;
  margin: 0 0 30px 0;
  padding: 0 0 20px 0;
}
section:last-of-type {
  border-bottom: none;
  padding: 0 0 1em 0;
}
select {
  margin: 0 1em 1em 0;
  position: relative;
  top: -1px;
}
video {
  background: #222;
  margin: 0 0 20px 0;
  /* --width: 100%; */
  /* width: var(--width);
  height: calc(var(--width) * 0.75); */
  width: 1000px;
  height: 800px;
}
@media screen and (max-width: 450px) {
  h1 {
    font-size: 20px;
  }
}
 button {
  margin: 0 3px 10px 0;
  padding-left: 2px;
  padding-right: 2px;
  width: 99px;
}

button:last-of-type {
  margin: 0;
}

p.borderBelow {
  margin: 0 0 20px 0;
  padding: 0 0 20px 0;
}
video {
  vertical-align: top;
  /* --width: 25vw;
  width: var(--width);
  height: calc(var(--width) * 0.5625); */
  width: 900px;
  height: 650px;
}
video:last-of-type {
  margin: 0 0 20px 0;
}
video#gumVideo {
  margin: 0 20px 20px 0;
}
</style>
</body>
</html>

谷歌浏览器108.0.5359.99,打开视频播放页面,视频不是高清的
网上有很多说修改分辨率的,但是我改了width和height不懂对不对,是没有效果的。
我想要的效果是,希望能播放高清的视频。因为我要对图像进行截图。具体一点就是希望能看清A4纸上四号或小四的字。摄像头与纸张距离越40厘米。
  • 写回答

6条回答 默认 最新

  • 「已注销」 2022-12-12 09:40
    关注
    获得3.30元问题酬金

    啊,你用什么连接的啊你的线是不是用的高清线他这个和传输的线也有关系的

    评论

报告相同问题?

问题事件

  • 系统已结题 12月20日
  • 创建了问题 12月12日

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?