RTCEncodedVideoFrame
基线 2023 *
新推出
注意:此功能在 专用 Web Workers 中可用。
RTCEncodedVideoFrame 是 WebRTC API 的一部分,用于表示 WebRTC 接收器或发送器管道中的一个编码视频帧,可以通过 WebRTC 编码转换 进行修改。
实例属性
RTCEncodedVideoFrame.type只读-
返回当前帧是关键帧、增量帧还是空帧。
RTCEncodedVideoFrame.timestamp只读 已弃用 非标准-
返回采样开始时帧的时间戳。
RTCEncodedVideoFrame.data-
返回包含编码帧数据的缓冲区。
实例方法
RTCEncodedVideoFrame.getMetadata()-
返回与帧关联的元数据。
描述
原始视频数据以帧序列的形式生成,其中每一帧都是像素值的二维数组。视频编码器将此原始输入转换为原始数据的压缩表示形式,以便传输和存储。一种常见的方法是发送包含足够信息以在相对较低的速率重现整个图像的“关键帧”,并在关键帧之间发送许多小得多的“增量帧”,这些帧仅编码自前一帧以来的更改。
有许多不同的编解码器,例如 H.264、VP8 和 VP9,每种编解码器都有不同的编码过程和配置,在压缩效率和视频质量之间提供不同的权衡。
RTCEncodedVideoFrame 代表由特定视频编码器编码的单个帧。type 属性指示该帧是“关键”帧还是“增量”帧,您可以使用 getMetadata() 方法获取有关编码方法的其他详细信息。data 属性提供对该帧编码图像数据的访问,然后可以在发送或接收帧时对其进行修改(“转换”)。
示例
此代码片段展示了 Worker 中 rtctransform 事件的处理程序,该处理程序实现了一个 TransformStream,并将编码帧从 event.transformer.readable 管道传输到 event.transformer.writable(event.transformer 是 RTCRtpScriptTransform 的 Worker 端对应物 RTCRtpScriptTransformer)。
如果将转换器插入视频流,则在 event.transformer.readable 上排队新帧时,transform() 方法会使用 RTCEncodedVideoFrame 进行调用。transform() 方法展示了如何读取此帧,通过反转位进行修改,然后将其排队到控制器(这最终将其通过管道传输到 event.transformer.writable,然后再传回 WebRTC 管道)。
addEventListener("rtctransform", (event) => {
const transform = new TransformStream({
async transform(encodedFrame, controller) {
// Reconstruct the original frame.
const view = new DataView(encodedFrame.data);
// Construct a new buffer
const newData = new ArrayBuffer(encodedFrame.data.byteLength);
const newView = new DataView(newData);
// Negate all bits in the incoming frame
for (let i = 0; i < encodedFrame.data.byteLength; ++i) {
newView.setInt8(i, ~view.getInt8(i));
}
encodedFrame.data = newData;
controller.enqueue(encodedFrame);
},
});
event.transformer.readable
.pipeThrough(transform)
.pipeTo(event.transformer.writable);
});
请注意,使用 WebRTC 编码转换中提供了更完整的示例。
规范
| 规范 |
|---|
| WebRTC Encoded Transform # rtcencodedvideoframe |
浏览器兼容性
加载中…