前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WebRTC 保存视频 YUV 数据的常用方法

WebRTC 保存视频 YUV 数据的常用方法

作者头像
liuzhen007
发布2022-11-08 13:09:13
1.7K0
发布2022-11-08 13:09:13
举报
文章被收录于专栏:流媒体音视频

前言

WebRTC 中每个音视频处理环节都对应着很多的类和结构体,它们中的很多都与视频 YUV 数据打交道,当分析到某个位置时,很希望知道这里的音视频数据是否正常,最好的方式就在这里把音视频数据保存下来,然后使用相应的播放器或者分析工具进行分析验证。本文以视频为例介绍两个常见的类保存 YUV 数据的方法。

正文

接下来,针对 webrtc::VideoFrame 和 webrtc::I420Buffer 两种类型介绍如何保存其中 YUV 数据的方法。

1. webrtc::VideoFrame 类型

webrtc::VideoFrame 类型是 WebRTC 中常见的数据类型,保存 webrtc::VideoFrame 类型 YUV 数据的代码实例如下:

代码语言:javascript
复制
    rtc::scoped_refptr<webrtc::VideoFrameBuffer> vfb = frame.video_frame_buffer();
    static FILE *fp = fopen(file, "wb+");
    if (fp != NULL) {
        fwrite(vfb.get()->GetI420()->DataY(), 1, frame.height() * frame.width(), fp);
        fwrite(vfb.get()->GetI420()->DataU(), 1, frame.height() * frame.width() / 4, fp); 
        fwrite(vfb.get()->GetI420()->DataV(), 1, frame.height() * frame.width() / 4, fp);
        fflush(fp);
    }
2. webrtc::I420Buffer 类型

webrtc::I420Buffer 类型是 WebRTC 中常见的数据类型,保存 webrtc::I420Buffer 类型 YUV 数据的代码实例如下:

代码语言:javascript
复制
  i420_buffer_ = webrtc::I420Buffer::Create(frame_width, frame_height);
  libyuv::ConvertToI420(output_data, 0, i420_buffer_->MutableDataY(),
                        i420_buffer_->StrideY(), i420_buffer_->MutableDataU(),
                        i420_buffer_->StrideU(), i420_buffer_->MutableDataV(),
                        i420_buffer_->StrideV(), 0, 0, frame_width,
                        frame_height, frame_width, frame_height,
                        libyuv::kRotate0, libyuv::FOURCC_ARGB);
  std::string fileName = "G:\\record_" + std::to_string(frame_width) + "x" + std::to_string(frame_height) + ".yuv";
  static FILE *fp = fopen(fileName.c_str(), "wb+");
  if (fp != NULL) {
      fwrite(i420_buffer_->MutableDataY(), 1, frame_width * frame_height, fp);
      fwrite(i420_buffer_->MutableDataU(), 1, frame_width * frame_height / 4, fp); 
      fwrite(i420_buffer_->MutableDataV(), 1, frame_width * frame_height / 4, fp);
      fflush(fp);
  }

注意事项

注意:尽量用“wb+”打开文件,不要用“ab+”模式,由于后者不清空原有文件,很容易误导我们以为代码没有生效,因为 yuv 文件播放到最后才是最新写入的内容。

当然这也要看具体需求,接下来简单对比一下“ab+”和“wb+”的异同:

(1)"wb+"模式

a. 以二进制形式打开文件。

b. 打开文件进行“读写”操作,即既可读取,又可写入。

c. 若欲操作的文件不存在,则新建文件。

d. 成功打开文件时,文件指针位于文件开头。

e. 打开文件后,会清空文件内原有的内容。

f. 无论是读取内容还是写入内容,都可在文件中任意位置进行,且进行写入操作时,会覆盖原有位置的内容。

(2)"ab+"模式

a. 以二进制形式打开文件。

b. 打开文件进行“读写”操作,即既可读取,又可写入。

c. 若欲操作的文件不存在,则新建文件。

d. 成功打开文件时,文件指针位于文件结尾。

e. 打开文件后,不会清空文件内原有内容。

f. 读取内容时,可以在任意位置进行,但写入内容时,只会追加在文件尾部。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 玩转音视频 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
    • 1. webrtc::VideoFrame 类型
      • 2. webrtc::I420Buffer 类型
      • 注意事项
        • (1)"wb+"模式
          • (2)"ab+"模式
          相关产品与服务
          媒体处理
          媒体处理(Media Processing Service,MPS)是智能、强大、全面的多媒体数据处理服务,行业支持最全面的音视频编码标准,基于自研编码内核和AI算法,提供音视频转码和增强、媒体智能、质检评测等能力,帮助您提升媒体质量、降低成本,满足各类场景的音视频处理需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档