您好 我写了一个rtsp的客户端,解析rtsp码流 回调出来的数据写成文件再用官方00_video_decode解码 没有问题
但是调用您封装的接口的时候 总是报段错误,是不是我哪里调用不对呢 gdb调试报错信息如下:
写入数据长度=298781
fps=0
video_type=51
height=0
width=0
frame_timestamp_usec=0
channelid=0
payload_size=298781
pts=0
ctx[0]=0x55555979d0
Thread 12 "test" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fa37fdf30 (LWP 4923)]
0x0000007fb7f73024 in jmi::nvjmi_decoder_put_packet (ctx=0x55555979d0, packet=0x0) at nvjmi_dec.cpp:485
warning: Source file is more recent than executable.
485 if (packet->payload_size == 0){
(gdb) bt
#0 0x0000007fb7f73024 in jmi::nvjmi_decoder_put_packet (ctx=0x55555979d0, packet=0x0) at nvjmi_dec.cpp:485
#1 0x0000005555556594 in CallBackStreamFun(void*, int*, int, int, char*, RTSP_FRAME_INFO*, void*) ()
#2 0x0000007fb7f2a5e4 in CRtspParent::RecvData (this=this@entry=0x5555598fc0, pCRtp=0x5555c30030, pUserData=pUserData@entry=0x5555598fc0)
at /home/pes/mxj/data/nfs/mahxn0/workspace/multimedia_api/librtspclient/src/CRtspParent.cpp:1142
#3 0x0000007fb7f2b500 in CRtspParent::RecvDataThread (pUserData=pUserData@entry=0x5555598fc0)
at /home/pes/mxj/data/nfs/mahxn0/workspace/multimedia_api/librtspclient/src/CRtspParent.h:68
#4 0x0000007fb7f28db8 in rtsp_StartTask (p=) at /home/pes/mxj/data/nfs/mahxn0/workspace/multimedia_api/librtspclient/src/CRtspParent.cpp:96
#5 0x0000007fb79df088 in start_thread (arg=0x7fffffecbf) at pthread_create.c:463
#6 0x0000007fb7cd94ec in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
(gdb)
原调用代码如下:
FILE *fp4 = NULL;
int CallBackStreamFun(Rtsp_Client_Handle handle, int *_channelPtr, int _mediaType, int bufflen, char *pBuf, RTSP_FRAME_INFO *_frameInfo, void *userPtr)
{
int channel_id = *_channelPtr;
printf("写入数据长度=%ld\n", (unsigned long)bufflen);
printf("fps=%d\n",_frameInfo->video_fps);
printf("video_type=%d\n", _frameInfo->video_type);
printf("height=%d\n", _frameInfo->video_height);
printf("width=%d\n", _frameInfo->video_width);
printf("frame_timestamp_usec=%d\n", _frameInfo->frame_timestamp_usec);
printf("channelid=%d\n", channel_id);
nvPacket *packet;
packet->flags = 0;
packet->payload_size = (unsigned long)bufflen;
packet->payload = (unsigned char*)pBuf;
packet->pts = (unsigned long)_frameInfo->frame_timestamp_usec;
printf("payload_size=%ld\n", packet->payload_size);
printf("pts=%ld\n", packet->pts);
printf("ctx[%d]=%p\n", channel_id, ctx[channel_id]);
nvjmi_decoder_put_packet(ctx[channel_id], packet);
printf("put packet success\n");
// nvFrameMeta *frame_data;
// nvjmi_decoder_get_frame_meta(ctx[channel_id], frame_data);
return 0;
}
int CallBackStreamFun1(Rtsp_Client_Handle handle, int *_channelPtr, int _mediaType, int bufflen, char *pBuf, RTSP_FRAME_INFO *_frameInfo, void *userPtr)
{
if (NULL == fp4)
{
fp4 = fopen("../data/out.264", "wb");
int ret = fwrite(pBuf, 1, bufflen, fp4);
}
else
{
int ret = fwrite(pBuf, 1, bufflen, fp4);
}
return 0;
}
//状态回调
int StatueCallBack(int iRecvSum, int iRecvLostSum, int iNowStreamFlag, void *pUserData);
int StatueCallBack(int iRecvSum, int iRecvLostSum, int iNowStreamFlag, void *pUserData)
{
printf(">>>>>> pUserData[%s] iRecvSum[%d] iRecvLostSum[%d] iNowStreamFlag[%d] DisConnectStatue: ",
pUserData, iRecvSum, iRecvLostSum, iNowStreamFlag);
printf("\n");
}
int main()
{
int Ret;
nvJmiCtxParam ctx_param;
ctx_param.coding_type = NV_VIDEO_CodingH264;
ctx_param.resize_height = 1080;
ctx_param.resize_width = 1920;
//开始解析码流信息
//步骤1,初始化
Ret = RtspClient_Init_V3(16000,NULL,0);
if (Ret < 0)
{
printf("initial rtspclient_sdk failed!\n");
}
//步骤2,打开码流 创建解码器
for (int i = 0; i < multimedia_num; i++)
{
//每一路创建一个handle;
handle[i] = RtspClient_Create();
//每一路创建一个解码器
ctx[i] = nvjmi_create_decoder("dev0", &ctx_param);
Ret = RtspClient_OpenStream(handle[i], URL[i], RTP_OVER_UDP, VIDEO_CODEC_H264, CallBackStreamFun, StatueCallBack, streamID[i]);
if (0 > Ret)
{
printf("RtspClient_OpenStream Failed!!!! mahxn0 \n");
nvjmi_decoder_close(ctx[i]);
nvjmi_decoder_free_context(&ctx[i]);
RtspClient_CloseStream(handle[i]);
RtspClient_Destory(handle[i]);
handle[i] = NULL;
sleep(20);
continue;
}
}
while (1)
{
sleep(10000000);
}
RtspClient_UnInit();
return 0;
}