opencv使用h264_omx进行ffmpeg编码的问题

本文主要探讨了在Linux环境下,使用OpenCV处理图像并利用ffmpeg的h264_omx硬编码器进行编码时遇到的颜色异常问题。在分析原因后,发现是由于h264_omx编码器要求输入的YUV数据需4字节对齐,而OpenCV转换得到的数据为1字节对齐。为解决此问题,文章提供了通过调整编码接口、分配新的AVFrame并创建SwsContext进行像素格式转换的方法,最终成功实现了颜色正常的视频编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


使用opencv打开摄像头,对每一帧画面进行图像处理,之后使用ffmpeg进行H264编码,最后保存/发送编码数据。

使用opnecv图像处理后能够获取编码为 rgb24 和yuv420p 的 cv::Mat 图像数据,ffmpeg的H264 encoder可以选诸如libx264、h264_omx等编码器。

首先给出一个基本的测试流程代码,如下。

1、Windows测试libx264编码

在winodws下使用libx264编码器(注意,是软编码器),要求输入为yuv420p图像数据。

代码中函数RaspiEncode_InitRaspiEncode_Encode为使用ffmpeg库封装好的函数,分别用于实现初始化编码器、编码一帧yuv420p图像数据功能。

int RaspiEncode_Encode(const char* yuvData, uint8_t** h264Data, uint32_t *len, int audFlag)
{
   
   
  if(encode_inited == 0){
   
   
    return -1;
  }
  if(yuvData == NULL){
   
   
    return -2;
  }

#ifdef _WIN32
  static int64_t frameIdx = 0;
  frame->pts = frameIdx++;
#endif
  frame->data[0] = (uint8_t *)yuvData;                                  // y
  frame->data[1] = frame->data[0] + frame->width*frame->height;         // u
  frame->data[2] = frame->data[1] + frame->width*frame->height * 1 / 4; // v

  // 编码 省略
  int ret = avcodec_send_frame(enc_ctx, frame);  
  ...  
}

测试使用代码如下所示,其中使用cv::cvtColor(frame, yuv, cv::COLOR_BGR2YUV_I420);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aworkholic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值