ortp移植到hi3518eh264封包rtp发送.docx
- 文档编号:26381686
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:10
- 大小:17.43KB
ortp移植到hi3518eh264封包rtp发送.docx
《ortp移植到hi3518eh264封包rtp发送.docx》由会员分享,可在线阅读,更多相关《ortp移植到hi3518eh264封包rtp发送.docx(10页珍藏版)》请在冰豆网上搜索。
ortp移植到hi3518eh264封包rtp发送
ortp移植到hi3518eh.264封包rtp发送
看到ORTP是纯C实现的rtp库,于是移植到3518e试用一下.
1.下载源码
链接地址
里面有个tarres跳转链接跳转入
链接地址
下载最新的ortp-0.23.0.tar.gz,并解压
2.编译
./configure--prefix=/work/hi3518/ortp--host=arm-hisiv100nptl-linux
make
makeinstall
配置只需指定安装目录prefix,编译平台host即可,这里host直接赋值arm-hisiv100nptl-linux-gcc前缀即可,注意不是arm-hisiv100nptl-linux-而是arm-hisiv100nptl-linux。
3.部署到开发板
将编译生成的库/work/hi3518/ortp/lib/libortp.so.9复制到开发板/usr/lib中
4.添加ortp库到mpp2中
在海思SDKmpp2目录下新建rtp目录,将/work/hi3518/ortp/下全部内容复制到该目录下,
修改mpp2/sample/Makefile.param,添加:
INC_FLAGS+=-I$(MPP_PATH)/rtp/include-L$(MPP_PATH)/rtp/lib/-lortp
5.修改代码
示例程序venc中有将视频进行264编码并保存为文件(nfs挂载),这里一步步分析sample_venc.c即可找到最终的保存是通过sample_comm_venc.c中的SAMPLE_COMM_VENC_SaveH264函数完成的,这里只要修改该函数为封包发送即可。
下面是sample_comm_venc.c中需要添加的部分:
#include<ortp/ortp.h>
#include<signal.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/time.h>
#include<stdio.h>
#defineY_PLOAD_TYPE96//H.264
#defineMAX_RTP_PKT_LENGTH1400
#defineDefaultTimestampIncrement3600//(90000/25)
uint32_tg_userts=0;
RtpSession*pRtpSession=NULL;
/**初始化
*
*主要用于对ortp以及其它参数进行初始化
*@param:
char*ipStr目的端IP地址描述串
*@param:
iintport目的端RTP监听端口
*@return:
RtpSession*返回指向RtpSession对象的指针,如果为NULL,则初始化失败
*@note:
*/
RtpSession*rtpInit(char*ipStr,intport)
{
RtpSession*session;
char*ssrc;
printf("********oRTPforH.264Init********\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);
rtp_session_set_payload_type(session,Y_PLOAD_TYPE);
ssrc=getenv("SSRC");
if(ssrc!
=NULL){
printf("usingSSRC=%i.\n",atoi(ssrc));
//设置输出流的SSRC。
不做此步的话将会给个随机值
rtp_session_set_ssrc(session,atoi(ssrc));
}
returnsession;
}
/**结束ortp的发送,释放资源
*
*@param:
RtpSession*sessionRTP会话对象的指针
*@return:
0表示成功
*@note:
*/
intrtpExit(RtpSession*session)
{
printf("********oRTPforH.264Exit********\n");
g_userts=0;
rtp_session_destroy(session);
ortp_exit();
ortp_global_stats_display();
return0;
}
/**发送rtp数据包
*
*主要用于发送rtp数据包
*@param:
RtpSession*sessionRTP会话对象的指针
*@param:
constchar*buffer要发送的数据的缓冲区地址
*@param:
intlen要发送的数据长度
*@return:
int实际发送的数据包数目
*@note:
如果要发送的数据包长度大于BYTES_PER_COUNT,本函数内部会进行分包处理
*/
intrtpSend(RtpSession*session,char*buffer,intlen)
{
intsendBytes=0;
intstatus;
uint32_tvalid_len=len-4;
unsignedcharNALU=buffer[4];
//printf("sendlen=%d\n",len);
//如果数据小于MAX_RTP_PKT_LENGTH字节,直接发送:
单一NAL单元模式
if(valid_len<=MAX_RTP_PKT_LENGTH)
{
sendBytes=rtp_session_send_with_ts(session,
&buffer[4],
valid_len,
g_userts);
returnsendBytes;
}
elseif(valid_len>MAX_RTP_PKT_LENGTH)
{
//切分为很多个包发送,每个包前要对头进行处理,如第一个包
valid_len-=1;
intk=0,l=0;
k=valid_len/MAX_RTP_PKT_LENGTH;
l=valid_len%MAX_RTP_PKT_LENGTH;
intt=0;
intpos=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;
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))
{
intiSendLen;
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;
sendBytes=rtp_session_send_with_ts(session,
&buffer[pos-2],
iSendLen+2,
g_userts);
t++;
}
}
}
g_userts+=DefaultTimestampIncrement;//timestampincrease
returnlen;
}
在实现调用前需要进行ortp加载初始化,我们在该文件中的函数SAMPLE_COMM_VENC_GetVencStreamProc中添加初始化即可:
/***rtpinit****/
pRtpSession=rtpInit("129.1.4.196",8080);
if(pRtpSession==NULL)
{
printf("errorrtpInit");
exit(-1);
return0;
}
/******************************************
step2:
Starttogetstreamsofeachchannel.
******************************************/
注:
这里为了简便在程序中写死了发送目标为129.1.4.196:
8080,这要与下面的cfg.sdp对应.然后修改SAMPLE_COMM_VENC_SaveH264函数调用rtp发送:
/*****************************************************************************
*funciton:
saveH264stream
******************************************************************************/
HI_S32SAMPLE_COMM_VENC_SaveH264(FILE*fpH264File,VENC_STREAM_S*pstStream)
{
HI_S32i;
for(i=0;i<pstStream->u32PackCount;i++)
{
#if0
fwrite(pstStream->pstPack[i].pu8Addr[0],
pstStream->pstPack[i].u32Len[0],1,fpH264File);
fflush(fpH264File);
if(pstStream->pstPack[i].u32Len[1]>0)
{
fwrite(pstStream->pstPack[i].pu8Addr[1],
pstStream->pstPack[i].u32Len[1],1,fpH264File);
fflush(fpH264File);
}
#else
rtpSend(pRtpSession,
pstStream->pstPack[i].pu8Addr[0],
pstStream->pstPack[i].u32Len[0]);
if(pstStream->pstPack[i].u32Len[1]>0)
{
rtpSend(pRtpSession,
pstStream->pstPack[i].pu8Addr[1],
pstStream->pstPack[i].u32Len[1]);
}
#endif
}
returnHI_SUCCESS;
}
这样编译获得sample_venc.
6.运行
将sample_venc加载到开发板并运行,
#./sample_venc0
pleasepresstwiceENTERtoexitthissample
********oRTPforH.264Init********
AvprofileaddH.264
ortp-message-Settingrandomlocaladdresses.
ortp-message-rtpsession[0x1c95758]settortp[129.1.4.196:
8080]rtcp[129.1.4.196:
8081]
ortp-message-Usingpermissivealgorithm
ortp-message-SendingRTCPSRcompoundmessageonsession[0x1c95758].
ortp-message-SendingRTCPSRcompoundmessageonsession[0x1c95758].
......
7.VLC播放
PC端使用VLC来播放,编写cfg.sdp如下:
m=video8080RTP/AVP96
a=rtpmap:
96H264/90000;
a=decode_buf=300;
a=framerate:
25
c=INIP4129.1.4.196这里
129.1.4.196
即为
PC
的
IP
,
Port8080
为监控
rtp
使用端口,
payloadtype
为
96
,即
h.264.
VLC能够正常播放,但有延时。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ortp 移植 hi3518eh264 封包 rtp 发送