如何用Web Codecs API处理原始音频和视频流?

来源:Vuejs社区作者:厦门程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何用Web Codecs API处理原始音频和视频流?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用Web Codecs API处理原始音频和视频流?》有用,将其分享出去将是对创作者最好的鼓励。

Web Codecs API是浏览器层面提供的原生媒体处理接口,允许开发者直接访问和操作原始音频、视频数据,跳过传统媒体处理流程中的中间层,实现更高效的编码、解码、转码等操作,适合实时音视频处理、媒体编辑等场景。

如何用Web Codecs API处理原始音频和视频流?

Web Codecs API核心概念

在使用Web Codecs API处理原始流之前,需要了解几个核心对象:

  • VideoEncoder:视频编码器,用于将原始视频帧编码为指定格式的压缩视频数据
  • VideoDecoder:视频解码器,用于将压缩视频数据解码为原始视频帧
  • AudioEncoder:音频编码器,用于将原始音频数据编码为压缩音频格式
  • AudioDecoder:音频解码器,用于将压缩音频数据解码为原始音频数据
  • EncodedVideoChunk:编码后的视频数据块,是编码器的输出和解码器的输入
  • EncodedAudioChunk:编码后的音频数据块,是音频编码器的输出和解码器的输入

处理原始视频流

解码原始视频流

如果拿到的是编码后的视频数据块,可使用VideoDecoder解码为原始视频帧,首先需要初始化解码器:

// 初始化视频解码器
const videoDecoder = new VideoDecoder({
  output: (videoFrame) => {
    // 处理解码后的原始视频帧
    console.log('解码得到视频帧,宽度:', videoFrame.displayWidth, '高度:', videoFrame.displayHeight);
    // 使用完帧之后需要关闭,释放资源
    videoFrame.close();
  },
  error: (err) => {
    console.error('视频解码错误:', err);
  }
});

// 配置解码器,需要匹配输入视频的编码格式
videoDecoder.configure({
  codec: 'vp8', // 编码格式,如vp8、vp9、avc1等
  codedWidth: 1280,
  codedHeight: 720
});

// 假设收到编码后的视频数据块,创建EncodedVideoChunk并送入解码器
const encodedChunkData = new Uint8Array([/* 实际的编码视频数据 */]);
const encodedVideoChunk = new EncodedVideoChunk({
  type: 'key', // 帧类型,key表示关键帧,delta表示非关键帧
  timestamp: 0, // 时间戳,单位微秒
  duration: 33333, // 帧时长,单位微秒,对应30fps
  data: encodedChunkData
});
videoDecoder.decode(encodedVideoChunk);

// 解码完成后刷新解码器
videoDecoder.flush();

编码原始视频帧为视频流

如果已经有原始视频帧,需要编码为压缩视频流,可使用VideoEncoder:

// 初始化视频编码器
const videoEncoder = new VideoEncoder({
  output: (encodedVideoChunk) => {
    // 处理编码后的视频数据块,可存储或传输
    console.log('编码得到视频块,时间戳:', encodedVideoChunk.timestamp);
  },
  error: (err) => {
    console.error('视频编码错误:', err);
  }
});

// 配置编码器参数
videoEncoder.configure({
  codec: 'vp8',
  width: 1280,
  height: 720,
  bitrate: 2000000, // 码率,单位bps
  framerate: 30 // 帧率
});

// 创建原始视频帧,这里以Canvas生成的帧为例
const canvas = document.createElement('canvas');
canvas.width = 1280;
canvas.height = 720;
const ctx = canvas.getContext('2d');
// 绘制简单内容到Canvas
ctx.fillStyle = 'red';
ctx.fillRect(0, 0, 1280, 720);

// 从Canvas生成VideoFrame
const videoFrame = new VideoFrame(canvas, {
  timestamp: 0,
  duration: 33333
});

// 送入编码器编码
videoEncoder.encode(videoFrame);
// 编码完成后关闭帧释放资源
videoFrame.close();

// 编码完成后刷新编码器
videoEncoder.flush();

处理原始音频流

解码原始音频流

音频解码流程和视频类似,使用AudioDecoder处理编码后的音频数据块:

// 初始化音频解码器
const audioDecoder = new AudioDecoder({
  output: (audioData) => {
    // 处理解码后的原始音频数据
    console.log('解码得到音频数据,采样率:', audioData.sampleRate, '通道数:', audioData.numberOfChannels);
    // 使用完音频数据后关闭释放资源
    audioData.close();
  },
  error: (err) => {
    console.error('音频解码错误:', err);
  }
});

// 配置音频解码器
audioDecoder.configure({
  codec: 'opus', // 音频编码格式,如opus、aac等
  sampleRate: 48000,
  numberOfChannels: 2
});

// 创建编码后的音频数据块
const encodedAudioData = new Uint8Array([/* 实际的编码音频数据 */]);
const encodedAudioChunk = new EncodedAudioChunk({
  type: 'key',
  timestamp: 0,
  duration: 1000000, // 1秒音频
  data: encodedAudioData
});

// 送入解码器解码
audioDecoder.decode(encodedAudioChunk);
// 刷新解码器
audioDecoder.flush();

编码原始音频数据为音频流

原始音频数据编码为压缩音频流使用AudioEncoder,示例如下:

// 初始化音频编码器
const audioEncoder = new AudioEncoder({
  output: (encodedAudioChunk) => {
    // 处理编码后的音频数据块
    console.log('编码得到音频块,大小:', encodedAudioChunk.byteLength);
  },
  error: (err) => {
    console.error('音频编码错误:', err);
  }
});

// 配置音频编码器
audioEncoder.configure({
  codec: 'opus',
  sampleRate: 48000,
  numberOfChannels: 2,
  bitrate: 128000 // 音频码率
});

// 创建原始音频数据,这里生成1秒的静音数据
const sampleRate = 48000;
const numberOfChannels = 2;
const length = sampleRate; // 1秒采样数
const audioData = new AudioData({
  format: 'f32', // 音频数据格式,f32表示32位浮点型
  sampleRate: sampleRate,
  numberOfChannels: numberOfChannels,
  numberOfFrames: length,
  timestamp: 0,
  data: new Float32Array(length * numberOfChannels) // 初始化为静音数据
});

// 送入编码器编码
audioEncoder.encode(audioData);
// 关闭音频数据释放资源
audioData.close();

// 刷新编码器
audioEncoder.flush();

注意事项

  • 所有的VideoFrameAudioData对象使用完成后必须调用close()方法,否则会造成内存泄漏
  • 编码和解码器的配置参数必须和输入数据的格式匹配,否则会导致处理失败
  • 时间戳和时长单位都是微秒,处理时需要注意单位转换
  • Web Codecs API目前主流现代浏览器都已经支持,但在使用前建议检查兼容性
Web Codecs API提供了底层的音视频处理能力,相比传统的MediaRecorder等接口,灵活性更高,适合需要自定义处理原始流的业务场景,开发者可根据实际需求选择合适的接口组合。

Web_Codecs_API原始音频流原始视频流媒体处理修改时间:2026-07-15 03:06:35

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。