- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们的屏幕录制 chrome 扩展允许用户使用 getDisplayMedia 录制他们的屏幕API,它返回一个输入 MediaRecorder 的流API。
通常,我们会使用带有较新 vp9 编解码器的 webm 视频容器来记录此流,如下所示:
const mediaRecorder = new MediaRecorder(mediaStream, {
mimeType: "video/webm; codecs=vp9"
});
但是,Safari 不支持 webm 容器,也不支持解码 vp9 编解码器。由于 Chrome 中的 MediaRecorder API 仅支持在 webm 容器中录制,但确实支持 h264 编码(Safari 可以解码),因此我们在 webm 容器中使用 h264 编解码器进行录制:
const mediaRecorder = new MediaRecorder(mediaStream, {
mimeType: "video/webm; codecs=h264"
});
这很好用有两个原因:
performance.now
手动测量它。被证明是不精确的(有 25 毫秒到 150 毫秒的错误),我们不得不更改为将记录器数据输入 MediaSource 以便我们可以使用
mediaSourceBuffer.buffered.end(sourceBuffer.buffered.length - 1) * 1000
API 以 100% 准确读取迄今为止记录的视频流持续时间(以毫秒为单位)。
mediaSourceBuffer = mediaSource.addSourceBuffer("video/webm; codecs=h264");
结果是:
Failed to execute 'addSourceBuffer' on 'MediaSource': The type provided ('video/webm; codecs=h264') is unsupported.
为什么 MediaRecorder 支持 mime 类型,但 MediaSource 不支持?由于它们属于同一个 API 系列,它们不应该支持相同的 mime 类型吗?在使用 addSourceBuffer 将数据传递到 MediaSource 时,我们如何使用 h264 编解码器进行录制?
buffered.end
读取迄今为止录制的视频的准确持续时间。 API,以及 h264 中的一个记录,以便我们能够立即将视频数据移动到 mp4 容器,而无需为 Safari 用户将编解码器从 vp9 转码为 h264。但是,这将是非常低效的,因为它将有效地在 RAM 中保存两倍的数据。
最佳答案
解码器和编码器完全是不同的野兽。例如,Webkit (Safari) 可以解码一些格式,但它不能编码任何东西。
此外,MediaSource API 要求传递给它的媒体可以是分段的,因此不能读取浏览器可以解码的所有媒体,例如,如果有一天某个浏览器支持生成标准(非分段)mp4 文件,那么它们仍然无法将其传递给 MediaSource API。
我不能确定他们是否可以支持这个特定的编解码器(我猜是的),但你甚至可能根本不需要所有的解决方法。
如果您的扩展能够生成 DOM 元素,那么您可以简单地使用 <video>
元素告诉您录制视频的持续时间,使用描述的技巧in this answer :
设置currentTime
视频的数量很大,等待seeked
事件,你会得到正确的duration
.
const canvas_stream = getCanvasStream();
const rec = new MediaRecorder( canvas_stream.stream );
const chunks = [];
rec.ondataavailable = (evt) => chunks.push( evt.data );
rec.onstop = async (evt) => {
canvas_stream.stop();
console.log( "duration:", await measureDuration( chunks ) );
};
rec.start();
setTimeout( () => rec.stop(), 5000 );
console.log( 'Recording 5s' );
function measureDuration( chunks ) {
const blob = new Blob( chunks, { type: "video/webm" } );
const vid = document.createElement( 'video' );
return new Promise( (res, rej) => {
vid.onerror = rej;
vid.onseeked = (evt) => res( vid.duration );
vid.onloadedmetadata = (evt) => {
URL.revokeObjectURL( vid.src );
// for demo only, to show it's Infinity in Chrome
console.log( 'before seek', vid.duration );
};
vid.src = URL.createObjectURL( blob );
vid.currentTime = 1e10;
} );
}
// just so we can have a MediaStream in StackSnippet
function getCanvasStream() {
const canvas = document.createElement( 'canvas' );
const ctx = canvas.getContext( '2d' );
let stopped = false;
function draw() {
ctx.fillRect( 0,0,1,1 );
if( !stopped ) {
requestAnimationFrame( draw );
}
}
draw();
return {
stream: canvas.captureStream(),
stop: () => stopped = true
};
}
关于javascript - 如何将 h264 编码的 MediaRecorder 流传递给 Chrome 中的 MediaSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62032820/
所以我正在尝试构建一个直播应用程序,但遇到了一个奇怪的问题。 所以我使用 getUserMedia 来捕获用户的视频,然后将该用户标记为广播者。然后我使用 MediaRecorder 从 MediaS
我想测试我用Python编写的一些FFT分析代码是否与Javascript MediaSource FFT节点完全相同。 (参见此处的示例 Web Audio API Analyser Node No
我认为这可能与Changing with HTML5 Audio works in Chrome but not Safari有关 我遇到的问题是,将 MediaSource 附加到后台选项卡中的
我可以通过使用 GET 请求和 Range header 请求数据 block 来播放 mp4 视频。 var FILE = 'Momokuri_Ep_09-10_SUB_ITA_dashinit.m
使用 QT 4.6,我试图访问我的 QResource 文件中的 wav 文件以用作媒体播放器的媒体源,但它不起作用: Phonon::MediaObject *music; music=Phono
我正在尝试在 HTML5/JS 中实现可靠、无缝的视频播放列表。为此,我想在内存中缓冲一个动态播放列表,然后将缓冲区发送到 HTML5 视频元素。 我可以选择视频的编码方式,这只能在 Chrome 浏
我正在尝试使用 MediaSource 播放两个单独的流(音频和视频)。我已经成功地按任意大小的顺序附加了它们的缓冲区(通过 XHR 检索的 ArrayBuffer 类型): 大小相同的 XXX 字节
我有一个服务器应用程序,它呈现一个 30 FPS 的视频流,然后将其实时编码和多路复用到一个 WebM Byte Stream 中。 . 在客户端,HTML5 页面向服务器打开一个 WebSocket
想知道是否有人知道 Chrome 移动设备是否/何时会实现 MediaSource Extension (MSE)?我的 iphone 5 上安装了 30.0 版本,但未能通过演示测试 ( http:
我尝试使用 MediaSource 播放两个视频,但只有一个有效。两者都将编解码器设置为 avc1.4d401f 和 mp4a.40.2,但其中一个播放得很好,另一个在我调用 SourceBuffer
所以我有一个正在下载的 .mp4 文件。我想使用 MediaSource API 将下载文件流式传输到视频元素中。我该怎么做? const NUM_CHUNKS = 5; var video = do
所以我有一个使用 Google 的 Shaka player 的网络应用程序用于视频播放。它使用 MediaSource用于流式传输音频和视频片段的 API。 我想对音轨的原始 PCM 数据进行一些音
我坚持在 Exoplayer 中播放并行的不同媒体流 场景: 我有一个音频媒体源。和一个视频媒体源。 我想在 ExoPlayer 中同时播放这两个媒体源 经过大量的研发我发现 > https://gi
我对 mediastream 和 mediasource api 的经验有限,您认为从 getusermedia 获取数据然后将该数据附加到 mediasource 的最佳方法是什么。现在我正在使用
就 HTML5 而言,我是新手。我正在查看 this link 上给出的 MediaSource API 文档 我访问了 this link 上给出的演示链接 但是它不起作用(在chrome下)。当我
MediaSource.isTypeSupported('audio/ogg; codecs="vorbis"') 返回 false - 这是否意味着我无法将 ogg 作为 POST 的响应进行流式传
假设我有一个页面允许用户选择宽度、高度、颜色和持续时间。我希望该页面随后生成具有这些尺寸和持续时间的视频,该视频只是该颜色的静态帧,然后将在该页面的 标记中播放。我可以使用 HTML5 MediaSo
更新: 所以我能够通过使用 offsetTimestamp 属性(在附加每个视频后增加它)来让它工作。 我现在的问题:1) 为什么在将 MediaSource.mode 设置为序列时没有正确完成? 2
我正在使用 HTML5 VideoSource 扩展,我需要知道 'updateend' 上如何报告时间事件。当我将事件记录到 Chrome 控制台时,我得到以下数据: 如屏幕截图所示,有一个时间戳值
我在玩 MediaSource API。代码直接取自 Mozilla 的示例页面:https://developer.mozilla.org/en-US/docs/Web/API/MediaSourc
我是一名优秀的程序员,十分优秀!