我正在Electron(因此Node.js )中试验MediaStream Recording API,并希望将输出作为流处理。作为流处理将允许我在之前处理 MediaRecorder 输出- 例如,我可以对其进行加密。对于我的具体用例,我只关心音频,所以我没有录制任何视频元素。
\n\n我最基本的用例是简单地使用流将输出保存到磁盘,但我似乎无法实现这一基本任务,所以我将把这个问题集中在实现这一点上。
\n\n问题:如何使用流将 MediaRecorder Web API 输出保存到磁盘。
\n\n我可以使用下载 \xe2\x80\x9chack\xe2\x80\x9d(由 Google 此处提供和描述)将文件保存到磁盘,并成功使用node.js fs打开、转换(加密)、保存新文件加密的文件,并删除未加密的文件。这意味着我最终必须将未加密的数据保存到磁盘上。即使时间很短,这也感觉像是一种安全妥协,我认为通过在保存之前加密可以很容易地避免这种情况。
\n\n我存在在不同流对象之间交叉很多电线的风险,但令我惊讶的是我还没有在网上找到解决方案 - 因此我提出了我的 StackOverflow 问题樱桃。
\n\n下面是一个突出显示我所尝试过的所有项目的项目。关键代码是record.js,在save()函数中。
\n\n最终,我试图创建一个合适的插件readStream
来插入使用 usingwriteStream
创建的。const writeStream = fs.createWriteStream(fPath);
readStream.pipe(writeStream)
总而言之,我尝试了以下方法:
\n\n1.Blob
到readStream
我无法转换Blob
为readStream
, only ReadableStream
,ReadableStreamDefaultReader
或Uint8Array
2.Blob
到file
(在内存中)然后使用fs.createReadStream()
我似乎无法使用 …
我正在使用MediaRecorder API和Canvas captureStream方法在浏览器中对画布的VP8视频流进行编码.此数据通过二进制Web套接字发送到FFmpeg.
var outputCaptureStream = $('canvas')[0].captureStream(30);
var mediaRecoder = new MediaRecoder(outputCaptureStream, {
mimeType: 'video/webm'
});
mediaRecorder.ondataavailable = function (e) {
ffmpegStdin.write(e.data);
}
mediaRecoder.start(1000);
Run Code Online (Sandbox Code Playgroud)
出于某种原因,流似乎随机切换到较低分辨率的中间流.FFmpeg对此不满意:
输入流#0:0帧从大小更改:1280x720 fmt:yuv420p到大小:1024x576 fmt:yuv420p
[vp8 @ 0x2a02c00]未实现升级.将您的FFmpeg版本更新为Git中的最新版本.如果问题仍然存在,则表示您的文件具有尚未实现的功能.[vp8 @ 0x2a02c00]如果您想提供帮助,请将此文件的样本上传到ftp://upload.ffmpeg.org/incoming/并联系ffmpeg-devel邮件列表.(ffmpeg-devel@ffmpeg.org)
我怀疑它与CPU使用率过高有关,并且Firefox试图通过缩小视频来提供帮助.我的问题:
我从收到的帧canvas
通过canvas.getDataURL()
.
但是,现在我有一系列png图像,但我想要一个视频文件.
我该怎么做呢?
var canvas = document.getElementById("mycanvaselementforvideocapturing");
var pngimages = [];
...
setInterval(function(){pngimages.push(canvas.toDataURL())}, 1000);
Run Code Online (Sandbox Code Playgroud) javascript canvas todataurl web-mediarecorder mediarecorder-api
我有一个使用canvas.captureStream()的画布流.我有来自webrtc视频通话的另一个视频流.现在我想将画布流与视频流的音轨混合在一起.我怎么能这样做?
我正在尝试学习如何在浏览器中记录媒体,我可能会过度复杂化.有大量直接的例子,但是当记录被推送到Blob
具有任意选择的媒体类型的对象时,我陷入了困境,而没有检查是否支持该格式.因此,我假设有一个列表或人们只是继续建立过去的经验.
例如,来自Mido22/MediaRecorder-sample:
mediaOptions = {
video: {
tag: 'video',
type: 'video/webm',
ext: '.mp4',
gUM: {video: true, audio: true}
},
audio: {
tag: 'audio',
type: 'audio/ogg',
ext: '.ogg',
gUM: {audio: true}
}
};
media = mv.checked ? mediaOptions.video : mediaOptions.audio;
//...
function makeLink(){
let blob = new Blob(chunks, {type: media.type })
//...
Run Code Online (Sandbox Code Playgroud)
或者来自MDN的使用媒体流录制API:
var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
Run Code Online (Sandbox Code Playgroud)
在规格和他们的 各种 单证大多是通用的描述为用户代理需要实现他们这是完全可以理解的.
这个问题的第一个答案就是我的想法,但我想知道某处是否有更容易访问和更新的列表?
更新:我几乎觉得好像我只是从岩石下爬出来,因为我一发布这个就意识到了最明显的两种方式......
我正在开发一个更高阶的组件,它将提供使用 MediaRecorder API 捕获媒体的能力。但是,当我尝试使用捕获的视频(以传递给 createObjectURL 的 Blob 形式)时,我收到错误ERR_REQUEST_RANGE_NOT_SATISFIABLE
。当我通过控制台记录传递给包装组件的 Blob 时,它的长度为 0。我已在本文末尾添加了我的代码。
为了诊断问题,我尝试了以下测试:
handleDataAvailable
记录正确的值(即[Blob]
)。React.useEffect(() => console.log(chunks), [chunks]);
为了查看块是否实际上正在更新。这也会导致记录正确的值(即[Blob]
)。React.useEffect(() => console.log(captured), [captured]);
为了查看捕获是否正在更新。这会导致记录大小为 0 的 Blob。handleStop
,我控制台日志块以及通过组合这些块创建的 blob。这会分别产生一个空数组和一个大小为 0 的 blob。这让我相信正确地将每个块添加到块数组中,但不知何故该数组在运行handleDataAvailable
时被清空。handleStop
有谁知道是什么原因导致这种情况发生?
代码:
import React from 'react';
import { getUserMedia, getConstraints } from '../../utils/general';
const withMediaCapture = (WrappedComponent, recordingType, facingMode, deviceID) => {
const constraints = getConstraints(recordingType, facingMode, deviceID);
const type = …
Run Code Online (Sandbox Code Playgroud) reactjs web-mediarecorder mediastream mediarecorder-api react-hooks
我正在Chrome 中通过MediaRecorder录制视频。我的代码类似于MediaStream docs 中的示例。我收到的视频没有Duration
元数据。
我将它mediainfo
与来自以下示例的 webm 文件进行了比较:
https://file-examples-com.github.io/uploads/2020/03/file_example_WEBM_480_900KB.webm
左边是 MediaRecorder 记录的文件的元数据,右边是示例 webm 文件。
DiffChecker 上的详细比较
有三个主要区别:
在 MediaRecorder 的文件中:
Duration
。Bit rate
。IsTruncated: Yes
。实际上,当我将此文件添加到具有控件属性的网站上的视频标签时,只有在文件显示到最后时才能使用控件。
我需要修复它并在此持续时间内保存未截断的文件。前端和后端解决方案都被接受。
duration truncated mediarecorder web-mediarecorder mediarecorder-api
javascript ×5
canvas ×2
mediastream ×2
webrtc ×2
duration ×1
electron ×1
firefox ×1
html5-canvas ×1
node.js ×1
react-hooks ×1
reactjs ×1
stream ×1
todataurl ×1
truncated ×1
web ×1