hi3516ev200进行rtmp推流报错“[SAMPLE_COMM_VENC_GetVencStreamProc]-2024: get venc stream time out, exit thr“

hi3516ev200进行rtmp推流报错"[SAMPLE_COMM_VENC_GetVencStreamProc]-2024: get venc stream time out, exit thr"

现象描述

如下图所示我在运行rtmp推流程序之后显示提示获取视频流失败,导致线程退出,而上面的提示又是"[Func]:imx307_2l_write_register [Line]:140 [Info]:I2C_WRITE error!",是与imx307相关的写寄存器错误,可能是sensor驱动相关的的错误,但是底层的sensor驱动时海思官方提供的时不可能错误的,所以可以联想到编译出程序所需sensor类型与我们开发板上的sensor类型不匹配,导致程序一系列与sensor相关的操作错误。
在这里插入图片描述

解决办法

在海思官方提供SDK的MPP/sample目录中有一个名为Makefile.param的sample编译脚本,其中的部分内容为:

################# select sensor type for your sample #################
####    SONY_IMX335_MIPI_5M_30FPS_12BIT              #################
####    SONY_IMX335_MIPI_4M_30FPS_12BIT              #################
####    SONY_IMX327_MIPI_2M_30FPS_12BIT              #################
####    SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1      #################
####    SONY_IMX307_MIPI_2M_30FPS_12BIT              #################
####    SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1      #################
####    SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1      #################
####    OMNIVISION_OS05A_MIPI_5M_30FPS_12BIT         #################
####    BT1120_2M_30FPS_8BIT                         #################

#### the previous sequence only for Hi3516EV300,Hi3516DV200 etc. #####

####    BT656_2M_30FPS_8BIT                          #################
####    SONY_IMX307_2L_MIPI_2M_30FPS_12BIT           #################
####    SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1   #################
####    SONY_IMX327_2L_MIPI_2M_30FPS_12BIT           #################
####    SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1   #################
####    SMART_SC4236_MIPI_3M_30FPS_10BIT             #################
####    SMART_SC4236_MIPI_3M_20FPS_10BIT             #################
####    SMART_SC2235_DC_2M_30FPS_10BIT               #################
####    SMART_SC2231_MIPI_2M_30FPS_10BIT             #################
####    SMART_SC3235_MIPI_3M_30FPS_10BIT             #################
####    GALAXYCORE_GC2053_MIPI_2M_30FPS_10BIT        #################
####    GALAXYCORE_GC2053_MIPI_2M_30FPS_10BIT_FORCAR #################

SENSOR0_TYPE ?= SONY_IMX307_2L_MIPI_2M_30FPS_12BIT 

上面提供了多种支持的sensor类型可供选择,其中最后一句:

SENSOR0_TYPE ?= SONY_IMX307_2L_MIPI_2M_30FPS_12BIT 

是指定sensor类型为SONY_IMX307,要根据自己板载的sensor类型,从上面给出的sensor类型中做出相应的修改,我的开发板的sensor类型为SC3235,所以应该改为SENSOR0_TYPE ?= SMART_SC3235_MIPI_3M_30FPS_10BIT
我从海思的官方sdk中的sample_comm_vi.c文件中找到一个函数:

HI_VOID SAMPLE_COMM_VI_GetSensorInfo(SAMPLE_VI_CONFIG_S *pstViConfig)
{
    HI_S32 i;

    for (i = 0; i < VI_MAX_DEV_NUM; i++)
    {
        pstViConfig->astViInfo[i].stSnsInfo.s32SnsId = i;
        pstViConfig->astViInfo[i].stSnsInfo.s32BusId = i;
        pstViConfig->astViInfo[i].stSnsInfo.MipiDev  = i;
        hi_memset(&pstViConfig->astViInfo[i].stSnapInfo, sizeof(SAMPLE_SNAP_INFO_S), 0, sizeof(SAMPLE_SNAP_INFO_S));
        pstViConfig->astViInfo[i].stPipeInfo.bMultiPipe = HI_FALSE;
        pstViConfig->astViInfo[i].stPipeInfo.bVcNumCfged = HI_FALSE;
    }

    pstViConfig->astViInfo[0].stSnsInfo.enSnsType = SENSOR0_TYPE;
}

其中pstViConfig->astViInfo[0].stSnsInfo.enSnsType = SENSOR0_TYPE;的SENSOR0_TYPE在程序中是没有定义的,是在刚刚我们上面看到的makefile中在程序编译的时候传入的sensor类型。同样在rtmp推流程序中也sample比较相似
在makefile文件中将原先指定的sensor类型改为-DSENSOR0_TYPE=SMART_SC3235_MIPI_3M_30FPS_10BIT后重新执行make编译,将程序上传到开发板运行即可。当然出现[SAMPLE_COMM_VENC_GetVencStreamProc]-2024: get venc stream time out, exit thr"这个错误提示还可能是其他的原因,上面讲到的只是其中一种情况。

以下是一个简单的例程,它演示了如何在Qt下使用OpenCV进行RTMP推流: ```c++ #include <QCoreApplication> #include <opencv2/opencv.hpp> #include <rtmp.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 初始化RTMPRTMP_LibInit(); // 创建RTMP对象 RTMP *rtmp = RTMP_Alloc(); // 设置RTMP属性 RTMP_SetupURL(rtmp, "rtmp://your_rtmp_server_address"); RTMP_EnableWrite(rtmp); RTMP_Connect(rtmp, NULL); RTMP_ConnectStream(rtmp, 0); // 打开视频文件 cv::VideoCapture cap(0); // 检查视频文件是否打开成功 if (!cap.isOpened()) { qDebug() << "Failed to open video file."; return -1; } // 定义视频帧 cv::Mat frame; // 读取视频帧并推送到RTMP服务器 while (true) { // 读取视频帧 cap >> frame; // 检查视频帧是否为空 if (frame.empty()) { qDebug() << "End of video file."; break; } // 将视频帧转换为RTMP数据包 RTMPPacket *packet = RTMPPacket_Alloc(1024 * 64); // 填充RTMP数据包 RTMPPacket_Reset(packet); packet->m_nChannel = 0x04; packet->m_headerType = RTMP_PACKET_SIZE_LARGE; packet->m_packetType = RTMP_PACKET_TYPE_VIDEO; packet->m_nTimeStamp = RTMP_GetTime() - 500; packet->m_nInfoField2 = rtmp->m_stream_id; packet->m_nBodySize = cv::imencode(".jpg", frame).size(); memcpy(packet->m_body, cv::imencode(".jpg", frame).data(), packet->m_nBodySize); // 发送RTMP数据包 RTMP_SendPacket(rtmp, packet, true); RTMPPacket_Free(packet); // 等待一段时间 cv::waitKey(30); } // 断开RTMP连接 RTMP_Close(rtmp); RTMP_Free(rtmp); // 清理RTMPRTMP_LibExit(); return a.exec(); } ``` 这个例程使用OpenCV的VideoCapture类来读取摄像头视频帧,并将每一帧转换为RTMP数据包,并使用RTMP_SendPacket函数将数据包发送到RTMP服务器。请注意,此示例中的推流代码仅适用于视频帧大小不超过64KB的情况,如果您的视频帧大小超过64KB,则需要修改代码以支持较大的数据包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值