作为一款可靠的视频推流功能组件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库内会自己计算时间戳,上层调用的时候并不需要指定时间戳,如果指定的时间戳准确,则不会出问题,但如果指定的时间戳错误,那么库内的计算过程则不会启动计算时间戳的过程。
该问题的解决关键,即是上文中关于时间戳赋值的两行代码,如上图中的红框标注内容,将其注释掉即可。