RTCEncodedVideoFrame

注意: 此功能在 专用 Web 工作线程 中可用。

RTCEncodedVideoFrameWebRTC API 的一部分,它代表 WebRTC 接收器或发送器管道中的已编码视频帧,可以使用 WebRTC 已编码转换 修改此帧。

注意: 此功能在 专用 Web 工作线程 中可用。

实例属性

RTCEncodedVideoFrame.type 只读

返回当前帧是关键帧、增量帧还是空帧。

RTCEncodedVideoFrame.timestamp 只读 已弃用 非标准

返回帧开始采样的时间戳。

RTCEncodedVideoFrame.data

返回包含已编码帧数据的缓冲区。

实例方法

RTCEncodedVideoFrame.getMetadata()

返回与帧关联的元数据。

描述

原始视频数据生成为一系列帧,每个帧都是二维像素值数组。视频编码器将此原始输入转换为原始视频的压缩表示形式,以便进行传输和存储。一种常见的方法是发送包含足够信息以相对较低速率重现整个图像的“关键帧”,并在关键帧之间发送许多更小的“增量帧”,这些帧只对自上一帧以来的变化进行编码。

有很多不同的编解码器,如 H.264、VP8 和 VP9,它们都具有不同的编码过程和配置,在压缩效率和视频质量之间提供不同的权衡。

RTCEncodedVideoFrame 表示使用特定视频编码器编码的单个帧。type 属性指示帧是“关键帧”还是“增量帧”,可以使用 getMetadata() 方法获取有关编码方法的其他详细信息。data 属性提供对帧的编码图像数据的访问,这些数据在发送或接收帧时可以被修改(“转换”)。

示例

此代码片段展示了 Workerrtctransform 事件的处理程序,该处理程序实现 TransformStream,并将编码帧从 event.transformer.readable 管道到 event.transformer.writableevent.transformerRTCRtpScriptTransformer,是工作线程端 RTCRtpScriptTransform 的对应物)。

如果转换器插入视频流,则每当在 event.transformer.readable 上排队新帧时,transform() 方法将使用 RTCEncodedVideoFrame 调用。transform() 方法展示了如何读取、通过反转位进行修改,然后在控制器上排队(这最终将其管道到 event.transformer.writable,然后返回到 WebRTC 管道)。

js
addEventListener("rtctransform", (event) => {
  const async 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 已编码转换
# rtcencodedvideoframe

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

另请参阅