海思项目学习记录 -3、ORTP库传输_libtoolize command not found(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

AF_XX 与PF_XX 地址族和协议族

setsockopt设置SO_REUSEADDR
https://blog.csdn.net/u010144805/article/details/78579528

3.3、RTP发送实验源码分析

首先要在common/sample_common_venc.c中添加ortp库的初始化函数和发送函数;
然后再就是修改venc/sample_venc.c;mmp初始化编码的步骤都不需要变,只需要修改之前存放到文件里面去,现在是使用ortp包发送。
venc/sample_venc.c

//venc/sample\_venc.c
HI_S32 SAMPLE\_COMM\_VENC\_SaveH264(FILE\* fpH264File, VENC_STREAM_S \*pstStream)
{
    HI_S32 i;

    
    for (i = 0; i < pstStream->u32PackCount; i++)
    {
    //只需要修改这里
    	#if ORTP\_ENABLE
		rtpSend(pRtpSession,pstStream->pstPack[i].pu8Addr, pstStream->pstPack[i].u32Len);
       #else
	   //文件则需要考虑偏移量,而ortp库则是网络流每次放到原地即可
        	fwrite(pstStream->pstPack[i].pu8Addr+pstStream->pstPack[i].u32Offset,
               pstStream->pstPack[i].u32Len-pstStream->pstPack[i].u32Offset, 1, fpH264File);

        	fflush(fpH264File);
        #endif
    }

sample_common_venc.c中

sample_common_venc.c中
//定义一个宏来管理。
#if ORTP\_ENABLE
#include <ortp/ortp.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#define Y\_PLOAD\_TYPE 96 //H.264
#define MAX\_RTP\_PKT\_LENGTH 1400
#define DefaultTimestampIncrement 3600 //(90000/25)
uint32\_t g_userts=0;
RtpSession \*pRtpSession = NULL;

#define LOCAL\_HOST\_IP "192.168.1.20"

/\*\* 初始化 
 \* 
 \* 主要用于对ortp以及其它参数进行初始化 
 \* @param: char \* ipStr 目的端IP地址描述串 
 \* @param: int port 目的端RTP监听端口 
 \* @return: RtpSession \* 返回指向RtpSession对象的指针,如果为NULL,则初始化失败 
 \* @note: 这个注意是从ortp-master\src\tests\rtpsend.c抄过来的
 \*/   
RtpSession \* rtpInit( char  \* ipStr, int  port)
{
    RtpSession \*session; 
    char  \*ssrc;
    printf("\*\*\*\*\*\*\*\*oRTP for H.264 Init\*\*\*\*\*\*\*\*\n");

    ortp\_init();
    ortp\_scheduler\_init();
    ortp\_set\_log\_level\_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
    session=rtp\_session\_new(RTP_SESSION_SENDONLY);	

    rtp\_session\_set\_scheduling\_mode(session,1);
    rtp\_session\_set\_blocking\_mode(session,0);
    //rtp\_session\_set\_connected\_mode(session,TRUE);
    rtp\_session\_set\_remote\_addr(session,ipStr,port);//设置远程IP和端口号 端口号就要两边一样可以通信就行了
    rtp\_session\_set\_payload\_type(session,Y_PLOAD_TYPE);

    ssrc=getenv("SSRC");
    if (ssrc!=NULL) {
        printf("using SSRC=%i.\n",atoi(ssrc));
        // 设置输出流的SSRC。不做此步的话将会给个随机值 
        rtp\_session\_set\_ssrc(session,atoi(ssrc));
    }
    return  session;
}
/\*\* 结束ortp的发送,释放资源 
 \* 
 \* @param: RtpSession \*session RTP会话对象的指针 
 \* @return: 0表示成功 
 \* @note: 
 \*/    
int  rtpExit(RtpSession \*session)   
{ 
    printf("\*\*\*\*\*\*\*\*oRTP for H.264 Exit\*\*\*\*\*\*\*\*\n");  
    g_userts = 0;   
       
    rtp\_session\_destroy(session);   
    ortp\_exit();   
    ortp\_global\_stats\_display();   
  
     return  0;   
}   
/\*\* 发送rtp数据包 
 \* 
 \* 主要用于发送rtp数据包 
 \* @param: RtpSession \*session RTP会话对象的指针 
 \* @param: const char \*buffer 要发送的数据的缓冲区地址 
 \* @param: int len 要发送的数据长度 
 \* @return: int 实际发送的数据包数目 
 \* @note: 如果要发送的数据包长度大于BYTES\_PER\_COUNT,本函数内部会进行分包处理 
 \*/   
int  rtpSend(RtpSession \*session, char  \*buffer,  int  len)
{  
    int  sendBytes = 0; 
    int status;       
    uint32\_t valid_len=len-4;
    unsigned char NALU=buffer[4];
     //分包发送,并且还涉及到一点H.264帧头的信息
    //如果数据小于MAX\_RTP\_PKT\_LENGTH字节,直接发送:单一NAL单元模式
    if(valid_len <= MAX_RTP_PKT_LENGTH)
    {
        sendBytes = rtp\_session\_send\_with\_ts(session,
                                             &buffer[4],  //注意从第四个字节开始 的H.264格式问题
                                             valid_len,
                                             g_userts);
    }
    else if (valid_len > MAX_RTP_PKT_LENGTH)
    {
        //切分为很多个包发送,每个包前要对头进行处理,如第一个包
        valid_len -= 1;
        int k=0,l=0;
        k=valid_len/MAX_RTP_PKT_LENGTH;
        l=valid_len%MAX_RTP_PKT_LENGTH;
        int t=0;
        int pos=5;
        if(l!=0)
        {
            k=k+1;
        }
        while(t<k)//||(t==k&&l>0))
        {
            if(t<(k-1))//(t<k&&l!=0)||(t<(k-1))&&(l==0))//(0==t)||(t<k&&0!=l))
            {
                buffer[pos-2]=(NALU & 0x60)|28;//把包的帧类型设置为RTP类型
                buffer[pos-1]=(NALU & 0x1f);
                if(0==t)
                {
                    buffer[pos-1]|=0x80;
                }
                sendBytes = rtp\_session\_send\_with\_ts(session,
                                                     &buffer[pos-2],
                                                     MAX_RTP_PKT_LENGTH+2,
                                                     g_userts);
                t++;
                pos+=MAX_RTP_PKT_LENGTH;
            }
            else //if((k==t&&l>0)||((t==k-1)&&l==0))
            {
                int iSendLen;
                if(l>0)
                {
                    iSendLen=valid_len-t\*MAX_RTP_PKT_LENGTH;
                }
                else
                    iSendLen=MAX_RTP_PKT_LENGTH;
                buffer[pos-2]=(NALU & 0x60)|28;
                buffer[pos-1]=(NALU & 0x1f);
                buffer[pos-1]|=0x40;//重要等级提1
                sendBytes = rtp\_session\_send\_with\_ts(session,
                                                     &buffer[pos-2],
                                                     iSendLen+2,
                                                     g_userts);
                t++;
            }
        }
    }

    g_userts += DefaultTimestampIncrement;//timestamp increase
    return  len;
}
#endif

4、VLC播放器的配置文件sdp

配置文件sdp;是一种格式,到时候VCL来以什么格式来解析。
m=video 8080 RTP/AVP 96 m表示内容 8080端口 RTP传输协议 96传输内容的协议
a=rtpmap:96 H264
a=framerate:25 帧率
c=IN IP4 192.168.1.20 IPV4的格式化,和本地的IP地址

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值