视频推流组件EasyRTMP_HIK推流到EasyDSS,如何处理由于时间戳无法播放的问题?

作为一款可靠的视频推流功能组件EasyRTMP,很多用户都会通过该组件的协助来搭建推流平台。最近有开发者在试用EasyRTMP_HIK工程的时候,发现将视频推流到EasyDSS流媒体服务播放不了,有时候只显示码流数据,却无法播放;有时候只会出现第一帧数据,显示一帧画面,后面就卡住不动了。

根据推流产生的该现象,我们按照以下三点来进行分析:

1、我们可以确认在EasyDSS上已经可以接收到码流数据,但是无法正常显示,说明数据流已经成功传送,无法播放很大可能性是解码的问题; 2、是否是由于解码性能不够导致的?但经过研究之后,我们很快排除了这一点。因为EasyDSS中集成的EasyPlayer播放器是一款很优秀的Web播放器,而且经过很多年的迭代,目前已经很完善; 3、那么很有可能是数据发送时间戳问题,EasyRTMP_HIK项目的原理是通过海康SDK的方式获取音视频流数据,然后通过EasyRTMP库推送出去。

在大概分析了过程后,我们对照如下工程源码,也并未发现异常的地方,数据也是按条件赋值一一传递的。

if (m_RtmpHandle && m_bRtmpRunning)
	{
		//H264推送RTMP
		EASY_AV_Frame	avFrame;
		memset(&avFrame, 0x00, sizeof(EASY_AV_Frame));

		avFrame.pBuffer = (unsigned char*)pBuffer;
		avFrame.u32AVFrameLen = nBufSize;
		avFrame.u32VFrameType = (bKeyFrame)?EASY_SDK_VIDEO_FRAME_I:EASY_SDK_VIDEO_FRAME_P;
		avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
		//avFrame.u32TimestampSec = lTimeStamp/1000000;
		//avFrame.u32TimestampUsec = (lTimeStamp%1000000);

		//EnterCriticalSection(&m_cs);
		EasyRTMP_SendPacket(m_RtmpHandle, &avFrame);	
	}

那么很有可能是推送库的问题。有这个想法后,我们及时和团队内部其他人员进行了沟通,得知了一个情况:即EasyRTMP库内会自己计算时间戳,上层调用的时候并不需要指定时间戳,如果指定的时间戳准确,则不会出问题,但如果指定的时间戳错误,那么库内的计算过程则不会启动计算时间戳的过程。

该问题的解决关键,即是上文中关于时间戳赋值的两行代码,如上图中的红框标注内容,将其注释掉即可。

原文地址:https://www.cnblogs.com/easydss/p/14784869.html