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

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

  • 相关阅读:
    Hugo搭建的博客删除文章事宜
    [GIT] Git学习笔记
    VS Code: 解决安装code-runner扩展run后无法在只读编辑器下编辑
    c/c++结构体总结
    恢复U盘做启动盘后的容量
    Manjaro安装Mysql
    win10环境下安装manjaro kde(双系统)
    IDEA设置编辑区主题
    IDEA设置主体、窗体及菜单的字体大小
    IDEA设置项目文件编码
  • 原文地址:https://www.cnblogs.com/easydss/p/14784869.html
Copyright © 2020-2023  润新知