使用opencv打开摄像头,对每一帧画面进行图像处理,之后使用ffmpeg进行H264编码,最后保存/发送编码数据。
使用opnecv图像处理后能够获取编码为 rgb24 和yuv420p 的 cv::Mat
图像数据,ffmpeg的H264 encoder可以选诸如libx264、h264_omx等编码器。
首先给出一个基本的测试流程代码,如下。
1、Windows测试libx264编码
在winodws下使用libx264编码器(注意,是软编码器),要求输入为yuv420p图像数据。
代码中函数RaspiEncode_Init
、RaspiEncode_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);