sk-3

sk-3

0个粉丝

6

问答

0

专栏

2

资料

sk-3  发布于  2015-01-05 09:08:58
采纳率 0%
6个问答
10888

ORTP移植hi3518 转

   
看到ORTP是纯C实现的rtp库,于是移植到3518e试用一下.

1.下载源码
[url]http://www.linphone.org/technical-corner/ortp/downloads[/url]

里面有个tar res跳转链接跳转入

[url]http://download.savannah.gnu.org/releases/linphone/ortp/sources/[/url]

下载最新的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中需要添加的部分:


[objc] view plaincopy
#include   
#include   
#include   
#include   
#include   
#include   
#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_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("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];  
      
    //printf("send len=%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);  
        return sendBytes;  
    }  
    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(t0))  
        {  
            if(t<(k-1))//(t             {  
                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))  
            {  
                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;  
                sendBytes = rtp_session_send_with_ts(session,  
                                                     &buffer[pos-2],  
                                                     iSendLen+2,  
                                                     g_userts);  
                t++;  
            }  
        }  
    }  
  
    g_userts += DefaultTimestampIncrement;//timestamp increase  
    return  len;  
}  
在实现调用前需要进行ortp加载初始化,我们在该文件中的函数SAMPLE_COMM_VENC_GetVencStreamProc中添加初始化即可:

[objc] view plaincopy
/***rtp init****/  
pRtpSession = rtpInit( "129.1.4.196" ,8080);   
if (pRtpSession==NULL)     
{     
    printf( "error rtpInit" );   
    exit(-1);   
    return  0;     
}   
  
/******************************************
step 2:  Start to get streams of each channel.
******************************************/  
注:这里为了简便在程序中写死了发送目标为129.1.4.196:8080,这要与下面的cfg.sdp对应.

然后修改SAMPLE_COMM_VENC_SaveH264函数调用rtp发送:
[objc] view plaincopy
/*****************************************************************************
* funciton : save H264 stream
******************************************************************************/  
HI_S32 SAMPLE_COMM_VENC_SaveH264(FILE* fpH264File, VENC_STREAM_S *pstStream)  
{  
    HI_S32 i;  
  
    for (i = 0; i < pstStream->u32PackCount; i++)  
    {  
        #if 0  
        fwrite(pstStream->pstPack.pu8Addr[0],  
               pstStream->pstPack.u32Len[0], 1, fpH264File);  
  
        fflush(fpH264File);  
  
        if (pstStream->pstPack.u32Len[1] > 0)  
        {  
            fwrite(pstStream->pstPack.pu8Addr[1],  
                   pstStream->pstPack.u32Len[1], 1, fpH264File);  
  
            fflush(fpH264File);  
        }  
        #else  
        rtpSend(pRtpSession,  
                pstStream->pstPack.pu8Addr[0],  
                pstStream->pstPack.u32Len[0]);  
        if (pstStream->pstPack.u32Len[1] > 0)  
        {  
            rtpSend(pRtpSession,  
                    pstStream->pstPack.pu8Addr[1],  
                    pstStream->pstPack.u32Len[1]);  
        }  
        #endif  
    }  
      
    return HI_SUCCESS;  
}  
这样编译获得 sample_venc.

6.运行

将sample_venc加载到开发板并运行,

#./sample_venc 0

please press twice ENTER to exit this sample

********oRTP for H.264 Init********

Av profile add H.264

ortp-message-Setting random local addresses.

ortp-message-rtp session [0x1c95758] set to rtp [129.1.4.196:8080] rtcp [129.1.4.196:8081]

ortp-message-Using permissive algorithm

ortp-message-Sending RTCP SR compound message on session [0x1c95758].

ortp-message-Sending RTCP SR compound message on session [0x1c95758].

......

7.VLC播放

PC端使用VLC来播放,编写cfg.sdp如下:

[plain] view plaincopy
m=video 8080 RTP/AVP 96  
a=rtpmap:96 H264/90000;  
a=decode_buf=300;  
a=framerate:25  
c=IN IP4 129.1.4.196  
这里129.1.4.196即为PC的IP,Port8080为监控rtp使用端口,payloadtype为96,即h.264.
VLC能够正常播放,但有延时。
//=================================================================================
是可以播放的,库中确实需要添加:
rtp_profile_set_payload(&av_profile, 96, &payload_type_h264);
注意例子是启动了三路venc,需要改为一路。
不过有问题,播放过程中提示:
Segmentation fault


[url]http://blog.csdn.net/jiaozi07/article/details/41749943[/url]
我来回答
回答8个
时间排序
认可量排序

一直未离开

0个粉丝

0

问答

0

专栏

0

资料

一直未离开 2015-01-09 15:42:44
认可0
这个必须顶。

jinzhang07

0个粉丝

2

问答

0

专栏

1

资料

jinzhang07 2015-01-24 12:38:10
认可0
呵呵 在论坛看到自己的文章。。。。。

cs_sos

0个粉丝

9

问答

2

专栏

5

资料

cs_sos 2015-01-24 13:58:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=11742&ptid=4956]jinzhang07 发表于 2015-1-24 12:38[/url]
呵呵 在论坛看到自己的文章。。。。。[/quote]

期待大作,我等膜拜 :)

duikang

0个粉丝

0

问答

0

专栏

0

资料

duikang 2015-01-26 19:33:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=11742&ptid=4956]jinzhang07 发表于 2015-1-24 12:38[/url]
呵呵 在论坛看到自己的文章。。。。。[/quote]

前辈,用你的方案VLC打开sdp,没有看到图像就崩溃推出了,是什么问题

zhitao2072

0个粉丝

0

问答

0

专栏

0

资料

zhitao2072 2015-01-28 11:18:47
认可0
支持一下,有空试试

3518hi

0个粉丝

0

问答

0

专栏

0

资料

3518hi 2015-06-25 16:54:56
认可0
ortp-message-Sending RTCP SR compound message on session [0x5f7758].
ortp-message-Sending RTCP SR compound message on session [0x5f7758].
ortp-message-Sending RTCP SR compound message on session [0x5f7758].
ortp-message-Sending RTCP SR compound message on session [0x5f7758].
ortp-message-Sending RTCP SR compound message on session [0x5f7758].
Segmentation fault



运行一段时间  就会崩溃
:Q:Q:Q:Q

fishcrane

0个粉丝

9

问答

0

专栏

0

资料

fishcrane 2016-09-23 19:16:32
认可0
按照您的方式为什么运行会提示rtp/lib//libortp.so 时跳过不兼容的 -lortp
arm-hisiv400-linux-gnueabi/bin/ld: 找不到 -lortp

请教

zcc246

0个粉丝

1

问答

0

专栏

0

资料

zcc246 2016-10-16 23:25:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=17493&ptid=4956]3518hi 发表于 2015-6-25 16:54[/url]
ortp-message-Sending RTCP SR compound message on session [0x5f7758].
ortp-message-Sending RTCP SR c ...[/quote]

您好 我想问下 最后调好没 我现在运行一段时间后就Segmentation fault 能告诉解决方法吗?
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区