检测视频分辨率变化
Detecting video resolution changes
使用某些编解码器和容器,视频可能会在中途更改分辨率。这在 RTC 风格的视频流中尤为常见,其中分辨率可以根据可用带宽缩放 up/down。在其他情况下,录制设备可能会旋转,视频可能会从纵向翻转为横向,反之亦然。
在网页(简单的 <video>
标签)上播放这些视频时,如何检测 JavaScript 何时发生这种大小变化?
我能想到的最好的方法是验证每一帧的视频大小,但这种方法有相当大的开销。如果有一种方法可以在视频大小改变或触发事件时触发回调,那最好了。
严重调整大小的视频示例:https://bugzilla.mozilla.org/attachment.cgi?id=8722238
您可以使用loadedmetadata
事件来定义全局变量或利用Element.dataset
来反映<video>
元素的初始.videoWidth
、.videoHeight
属性;在 <video>
的 timeupdate
事件初始存储和当前事件 .videoWidth
、.videoHeight
值,如果其中一个属性更改调用函数
window.onload = function() {
function handleResolutionChange(event) {
// do stuff if `.videoWidth` or `.videoHeight` changed from initial value
}
var video = document.querySelector("video");
video.addEventListener("loadedmetadata", function(event) {
event.target.dataset.width = event.target.videoWidth;
event.target.dataset.height = event.target.videoHeight;
})
video.addEventListener("timeupdate", function(event) {
if (+event.target.dataset.width !== event.target.videoWidth
&& +event.target.dataset.height !== event.target.videoHeight) {
// call `handleResolutionChange` one or more times
// if `event.target` `.videoWidth` or `.videoHeight` changed
handleResolutionChange.call(event.target, event)
}
})
}
看看这是否有帮助我不确定。
现在有一个 resize
事件会在视频分辨率更改时触发。
HTML
<p data-content="resolution"></p>
<video src="https://bug1250345.bmoattachments.org/attachment.cgi?id=8722238"></video>
JavaScript
document.querySelector('video').addEventListener('resize', (e) => {
document.querySelector('[data-content="resolution"]').textContent = [
e.target.videoWidth,
e.target.videoHeight
].join('x');
});
(JSFiddle: http://jsfiddle.net/qz61o2xt/)
参考文献:
使用某些编解码器和容器,视频可能会在中途更改分辨率。这在 RTC 风格的视频流中尤为常见,其中分辨率可以根据可用带宽缩放 up/down。在其他情况下,录制设备可能会旋转,视频可能会从纵向翻转为横向,反之亦然。
在网页(简单的 <video>
标签)上播放这些视频时,如何检测 JavaScript 何时发生这种大小变化?
我能想到的最好的方法是验证每一帧的视频大小,但这种方法有相当大的开销。如果有一种方法可以在视频大小改变或触发事件时触发回调,那最好了。
严重调整大小的视频示例:https://bugzilla.mozilla.org/attachment.cgi?id=8722238
您可以使用loadedmetadata
事件来定义全局变量或利用Element.dataset
来反映<video>
元素的初始.videoWidth
、.videoHeight
属性;在 <video>
的 timeupdate
事件初始存储和当前事件 .videoWidth
、.videoHeight
值,如果其中一个属性更改调用函数
window.onload = function() {
function handleResolutionChange(event) {
// do stuff if `.videoWidth` or `.videoHeight` changed from initial value
}
var video = document.querySelector("video");
video.addEventListener("loadedmetadata", function(event) {
event.target.dataset.width = event.target.videoWidth;
event.target.dataset.height = event.target.videoHeight;
})
video.addEventListener("timeupdate", function(event) {
if (+event.target.dataset.width !== event.target.videoWidth
&& +event.target.dataset.height !== event.target.videoHeight) {
// call `handleResolutionChange` one or more times
// if `event.target` `.videoWidth` or `.videoHeight` changed
handleResolutionChange.call(event.target, event)
}
})
}
看看这是否有帮助我不确定。
现在有一个 resize
事件会在视频分辨率更改时触发。
HTML
<p data-content="resolution"></p>
<video src="https://bug1250345.bmoattachments.org/attachment.cgi?id=8722238"></video>
JavaScript
document.querySelector('video').addEventListener('resize', (e) => {
document.querySelector('[data-content="resolution"]').textContent = [
e.target.videoWidth,
e.target.videoHeight
].join('x');
});
(JSFiddle: http://jsfiddle.net/qz61o2xt/)
参考文献: