ortp移植到hi3518eh.264封包rtp发送
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ortp移植到hi3518eh.264封包rtp发送
看到ORTP是纯C实现的rtp库,于是移植到3518e试用一下.
1.下载源码
链接地址
里面有个tar res跳转链接跳转入
链接地址
下载最新的ortp-0.23.0.tar.gz,并解压
2.编译
./configure --prefix=/work/hi3518/ortp
--host=arm-hisiv100nptl-linux
make
make install
配置只需指定安装目录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中
在海思SDK mpp2目录下新建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>
#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;
/** 初始化
*
* 主要用于对ortp以及其它参数进行初始化
* @param: char * ipStr 目的端IP地址描述串
* @param: iint port 目的端RTP监听端口
* @return: RtpSession * 返回指向RtpSession对象的指针,如果为NULL,则初始化失败
* @note:
*/
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_WARNIN G|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("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,本函数内部会进行分包处理