zoukankan      html  css  js  c++  java
  • 视频推流组件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库内会自己计算时间戳,上层调用的时候并不需要指定时间戳,如果指定的时间戳准确,则不会出问题,但如果指定的时间戳错误,那么库内的计算过程则不会启动计算时间戳的过程。

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

  • 相关阅读:
    程序返回插入数据库成功,但是数据库内却没有数据
    C++ 使用动态二维数组参数
    深入理解.Net中的内存释放,以及有关的注意事项
    用数据集时,错误:未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值
    关于堆和栈
    C#加密方法总汇
    const与readonly
    struts 将上传文件保存到数据库中
    java Annotation注解的运用
    转:获取汉字的拼音(包括一级和二级)
  • 原文地址:https://www.cnblogs.com/easydss/p/14784869.html
Copyright © 2011-2022 走看看