生成一个qt下用opencv的Mat格式图片通过rkmpp编码成h264,并通过rtsp推流的程序

时间: 2024-05-05 16:21:35 浏览: 12
以下是一个Qt下使用OpenCV的Mat格式图片通过RK3399的硬件编码器RKMPP编码成H.264并通过RTSP推流的程序示例。 ```cpp #include <QCoreApplication> #include <opencv2/opencv.hpp> #include <rockchip/rk_mpi.h> #include <rockchip/rk_mpp.h> #include <stdio.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 初始化RKMPP MPP_RET ret = mpp_env_init(); if (ret != MPP_OK) { printf("mpp_env_init failed!\n"); return -1; } // 创建编码器 MppCtx ctx; ret = mpp_create(&ctx, MPP_CTX_ENC); if (ret != MPP_OK) { printf("mpp_create failed!\n"); return -1; } // 配置编码器参数 MppApi *mpi = mpp_get_api(ctx); MppEncPrepCfg prep_cfg; prep_cfg.change = MPP_ENC_PREP_CFG_CHANGE_INPUT | MPP_ENC_PREP_CFG_CHANGE_FORMAT; prep_cfg.width = 640; prep_cfg.height = 480; prep_cfg.format = MPP_FMT_YUV420P; mpi->control(ctx, MPP_ENC_SET_PREP_CFG, &prep_cfg); MppEncCodecCfg codec_cfg; codec_cfg.coding = MPP_VIDEO_CodingAVC; codec_cfg.rc_mode = MPP_ENC_RC_MODE_CBR; codec_cfg.fps_in = 30; codec_cfg.fps_out = 30; codec_cfg.profile = MPP_PROFILE_AVC_MAIN; codec_cfg.level = MPP_LEVEL_UNKNOWN; codec_cfg.target_bitrate = 1000000; codec_cfg.qp_init = 26; codec_cfg.qp_max = 48; codec_cfg.qp_min = 20; mpi->control(ctx, MPP_ENC_SET_CODEC_CFG, &codec_cfg); // 初始化编码器 ret = mpi->init(ctx); if (ret != MPP_OK) { printf("mpi->init failed!\n"); return -1; } // 打开RTSP推流 cv::VideoWriter writer; writer.open("rtsp://localhost:8554/test.sdp", cv::CAP_FFMPEG, cv::VideoWriter::fourcc('H', '2', '6', '4'), 30, cv::Size(640, 480), true); // 加载测试图片 cv::Mat image = cv::imread("test.jpg"); if (image.empty()) { printf("Failed to load image!\n"); return -1; } // 创建输入YUV内存 MppFrame frame; ret = mpi->control(ctx, MPP_ENC_GET_EXTRA_INFO, &frame); if (ret != MPP_OK) { printf("mpi->control failed!\n"); return -1; } frame->width = 640; frame->height = 480; frame->hor_stride = 640; frame->ver_stride = 480; frame->fmt = MPP_FMT_YUV420P; mpp_frame_init(frame); // 创建输出H.264内存 MppBuffer packet_buf; mpp_buffer_get(ctx, &packet_buf, 4 * 1024 * 1024); MppPacket packet; mpp_packet_init(&packet, packet_buf); // 编码YUV图像 for (int i = 0; i < 100; i++) { // 将OpenCV的Mat格式转换为YUV格式 cv::Mat yuv_image; cv::cvtColor(image, yuv_image, cv::COLOR_BGR2YUV_I420); // 将YUV图像写入输入YUV内存 uint8_t *buf = (uint8_t *)mpp_buffer_get_ptr(frame->buf); memcpy(buf, yuv_image.data, 640 * 480 * 3 / 2); // 编码YUV图像 ret = mpi->encode_put_frame(ctx, frame, NULL); if (ret != MPP_OK) { printf("mpi->encode_put_frame failed!\n"); return -1; } // 获取编码后的H.264数据 ret = mpi->encode_get_packet(ctx, &packet); if (ret != MPP_OK) { printf("mpi->encode_get_packet failed!\n"); return -1; } // 将H.264数据写入RTSP推流 writer.write(packet->data, packet->length); } // 释放资源 writer.release(); mpp_packet_deinit(&packet); mpp_buffer_put(packet_buf); mpp_frame_deinit(&frame); mpi->reset(ctx); mpi->control(ctx, MPP_ENC_SET_IDR_FRAME, NULL); mpi->destroy(ctx); mpp_env_deinit(); return 0; } ``` 需要注意的几点: 1. 该示例程序使用的是Rockchip的RKMPP编码器。如果使用的是其他厂商的编码器,代码可能会有所不同。 2. 在编码器初始化时,需要设置编码器的参数。例如,设置编码器的分辨率、码率、帧率等。 3. 将OpenCV的Mat格式图像转换为YUV格式,并写入输入YUV内存。 4. 在编码器中,将输入YUV内存编码为H.264格式,并将编码后的数据写入输出H.264内存。 5. 将输出H.264内存的数据写入RTSP推流。在这个示例中,使用了OpenCV的VideoWriter类来实现RTSP推流。 6. 在程序结束前,需要释放所有资源。

相关推荐

最新推荐

recommend-type

C#中OpenCvSharp 通过特征点匹配图片的方法

主要介绍了OpenCvSharp 通过特征点匹配图片的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

python3+opencv3识别图片中的物体并截取的方法

如下所示: 运行环境:python3.6.4 opencv3.4.0 # -*- coding:utf-8 -*- ...# step2:用Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂
recommend-type

python使用openCV遍历文件夹里所有视频文件并保存成图片

主要介绍了python使用openCV遍历文件夹里所有视频文件并保存成图片,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
recommend-type

OpenCV中的cv::Mat函数将数据写入txt文件

主要介绍了OpenCVcv::Mat中的数据按行列写入txt文件中,需要的朋友可以参考下
recommend-type

OpenCV cv.Mat与.txt文件数据的读写操作

主要介绍了OpenCV cv.Mat 与 .txt 文件数据的读写操作,现在分享给大家,也给大家做个参考
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。