SkeyeRTMPClient关于RTMP协议TCP传输数据粘包问题解决方案(附源码)

本文介绍了SkeyeRTMPClient在处理RTMP协议中遇到的TCP粘包问题,特别是在支持H265播放时的挑战。文章详细阐述了解决粘包问题的流程,包括流接收、FLV数据包解析以及粘包处理的代码示例。同时提供了SkeyePlayer的下载链接和作者的联系方式,供读者进行技术交流和讨论。
摘要由CSDN通过智能技术生成

不久之前我们对SkeyeRTMPClient库扩展支持了HEVC(H.265),在后续的长期性能测试中,我们发现拉多路流时,会出现拉流播放一直都播不出来的问题,甚至有一定概率出现崩溃,经过长期的测试和排查,我们发现这是由于音视频数据发送比较频繁的时候出现的tcp粘包的问题,下面将详细讲述粘包问题的解决过程。

1. SkeyeRTMPClient流接收流程

SkeyeRTMPClient底层采用rtmp协议官方提供的librtmp库来实现rtmp流协议流程的连接建立,读取流数据,接收FLV数据组包分包等,然后将接收到的FLV数据包进行解析,从中解析出H264、H265、AAC等音视频编码帧数据,回调给上层库调用接口做解码播放以及进一步数据处理;流接收函数如下代码所示:

int RecvPacket(char * buf,uint32_t & buflen)
{
    if(rtmp_object_ == NULL && Reconnect())
    {
        return RTMP_UNCONNECTED;
    }    
    if(!RTMP_IsConnected(rtmp_object_) && (Reconnect() !=0))
    {
        return RTMP_RECONNECTED_FAILED;
    }   

    if(NULL == buf|| buflen < 100)
    {
        return RTMP_RECV_PARAMERROR;
    }

	if(!rtmp_object_)
	{
		return RTMP_UNCONNECTED;
	}

    int ret = RTMP_Read(rtmp_object_,buf,buflen);
    if(ret > 0)
    {
        SkeyeRTMPClient_AV_Frame av_frame = {0};
        
        if(ParserRecvPacket(av_frame,buf,ret,process_buf_) != 0)
        {
            return RTMP_PARSE_FAILED;
        }

		if(av_frame.u32FrameType == SKEYE_SDK_VIDEO_FRAME_FLAG && av_frame.u32VFrameType == SKEYE_SDK_VIDEO_FRAME_I && !bGetFirstKeyFrame_)
		{
            if(audio_channels_ == -1)
            {
                audio_channels_ = 0;
            }
            else
            {
			    bGetFirstKeyFrame_ = true;
			    SKEYE_MEDIA_INFO_T mediaInfo;
			    memset(&mediaInfo, 0, sizeof(SKEYE_MEDIA_INF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwordTwelve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值