第三季1:ORTP库的移植与视频的实时传输实验

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

本节内容是移植ORTP库,并使用ORTP库来完成视频的实时传输。

一、ORTP的简介

1、视频网络传输的两种方式

(1)基于下载的方式。比如http(Hyper Text Transfer Protocol 超文件传输协定)、ftp(File Transfer Protocol,文件传输协议)。基于下载的方式传输视频时,如果网速慢就不会实时,如果网速大于播放速率则会缓冲,这能够保证视频质量。

(2)基于实时的方式。比如RTP、RTSP、RTCP(是对RTP的一种补充,因为RTP只有传输而没有控制信息)。多应用于视频监控、直播等行业。

2、ORTP的介绍

(1)RTP(Real-time Transport Protocol,实时传输协议)是一个网络传输协议。它详细说明了在互联网上传递音频和视频的标准数据包格式。

(2)ORTP,即openRTP,它是用C实现的一个RTP库。即RTP是一种协议,而ORTP是协议的软件实现(体现为一个库)。ORTP库实现了RTP和RTCP协议,前者负责传输视频,后者负载视频传输的质量控制、同步、协调等。

(3)实质是一个视频服务器,工作时客户端和服务器实时传递视频数据。VLC播放器在这里充当客户端。

(4)一般认为RTP工作在传输层,但RTP其实比TCP/UDP高一个层次。

(5)RTP的实现由国际标准RFC3550规定,只要符合协议谁都可以写一个RTP的实现。

二、ORTP库的移植

1、准备源码

(1)下载ortp源码。OPTP库里面最关键的是include,src和src/test这三个文件夹,相应的数据结构和头文件存放在include/ortp目录下;src里面实现了一些功能函数;src/test是示例代码。

(2)将ortp-master.zip文件通过共享文件夹存放到ubuntu合适的目录,并解压。

root@ubuntu:/home/xjh/iot/hisi_development/ortp# ls
ortp-master.zip
root@ubuntu:/home/xjh/iot/hisi_development/ortp# unzip ortp-master.zip
//省略解压信息
root@ubuntu:/home/xjh/iot/hisi_development/ortp# ls
ortp-master  ortp-master.zip
root@ubuntu:/home/xjh/iot/hisi_development/ortp# 

2、增加H.264格式的payload支持

在/home/xjh/iot/hisi_development/ortp/ortp-master/src/avprofile.c文件中,av_profile_init函数末尾添加代码如下:

void av_profile_init(RtpProfile *profile)
{rtp_profile_clear_all(profile);profile->name="AV profile";rtp_profile_set_payload(profile,0,&payload_type_pcmu8000);rtp_profile_set_payload(profile,1,&payload_type_lpc1016);rtp_profile_set_payload(profile,3,&payload_type_gsm);rtp_profile_set_payload(profile,7,&payload_type_lpc);rtp_profile_set_payload(profile,4,&payload_type_g7231);rtp_profile_set_payload(profile,8,&payload_type_pcma8000);rtp_profile_set_payload(profile,9,&payload_type_g722);rtp_profile_set_payload(profile,10,&payload_type_l16_stereo);rtp_profile_set_payload(profile,11,&payload_type_l16_mono);rtp_profile_set_payload(profile,18,&payload_type_g729);rtp_profile_set_payload(profile,31,&payload_type_h261);rtp_profile_set_payload(profile,32,&payload_type_mpv);rtp_profile_set_payload(profile,34,&payload_type_h263);rtp_profile_set_payload(profile,96,&payload_type_h264);//added by xjh
}

3、配置和编译、安装

(1)进入ortp目录后执行“./autogen.sh”。

root@ubuntu:/home/xjh/iot/hisi_development/ortp/ortp-master# ./autogen.sh

执行该步骤时可能出现的错误及解决方法如下。

1)错误1:./autogen.sh: line 44: libtoolize: command not found

解决方法:执行“sudo apt-get install libtool*”。GNU Libtool 可以在不同的系统中建立动态链接库。它通过一个称为 Libtool 库的抽象,隐藏了不同系统之间的差异,给开发人员提供了一致的的接口。

2)错误2:libtoolize:   error: Please install GNU M4, or 'export M4=/path/to/gnu/m4'.

解决方法:执行“sudo apt-get install m4”。M4是一个宏处理器,将输入拷贝到输出,同时将宏展开。宏可以是内嵌的也可以是用户定义的。除了可以展开宏,M4还有一些内建的函数,用来引用文件,执行Unix命令,整数运算,文本操作,循环等。M4既可以作为编译器的前端也可以单独作为一个宏处理器。

3)错误3:Automake - aclocal: command not found 

解决方法:执行“sudo apt-get install automake”,主要用于创建makefile。

(2)接着执行“./configure --prefix=/tmp/ortp --host=arm-hisiv300-linux”。

1)--host=arm-hisiv300-linux,指定了交叉编译工具链,因此要正确安装交叉编译工具链。

2)--prefix=/tmp/ortp表示最后安装到/tmp/ortp此目录下(不用事先创建,后面自动生成)。

(3)接着执行一条命令“make && make install”。

4、查看移植完的库和头文件

在/tmp/ortp目录下如果有以下内容,则说明移植完成。

root@ubuntu:/tmp/ortp# ls
include  lib
root@ubuntu:/tmp/ortp# cd include/
root@ubuntu:/tmp/ortp/include# ls
ortp
root@ubuntu:/tmp/ortp/include# cd ortp/
root@ubuntu:/tmp/ortp/include/ortp# ls
b64.h      ortp.h         port.h  rtpprofile.h      sessionset.h  stun_udp.h
event.h    ortp_srtp.h    rtcp.h  rtpsession.h      str_utils.h   telephonyevents.h
logging.h  payloadtype.h  rtp.h   rtpsignaltable.h  stun.h        zrtp.h
root@ubuntu:/tmp/ortp/include/ortp# cd ../../lib/
root@ubuntu:/tmp/ortp/lib# ls
libortp.la  libortp.so  libortp.so.9  libortp.so.9.0.0  pkgconfig
root@ubuntu:/tmp/ortp/lib# 

三、利用RTP协议实现局域网实时视频传输

1、在SDK的sample中添加rtp传输代码

(1)在mpp/sample/venc/sample_venc.c文件中的SAMPLE_VENC_1080P_CLASSIC函数里修改代码如下(对于/sample_venc.c文件,仅做这一步修改而已,这修改表示原来有三路码流输出,但为了简单演示而设置为一路输出)。

 144 #ifdef hi3518ev201145         s32ChnNum = 1;146 #endif147         s32ChnNum = 1;//added by xjh148         printf("s32ChnNum = %d\n",s32ChnNum);149     150     stVbConf.u32MaxPoolCnt = 128;151     152     /*video buffer*/ 153         if(s32ChnNum >= 1)154     {

(2)接下来所有的修改,在mpp/sample/common/sample_common_venc.c文件中进行。

将完成修改的sample_common_venc.c文件替代原文件即可。

(3)这里补充说一下(2)中修改的思路。

A、使用ORTP库的sample和第二季的sample,它们的步骤相同,只是在“ 如何处理编码得到的码流 ”这个问题上不同。第二季的sample中是将码流保存为裸流文件,而使用 ORTP库的 sample是将码流数据以包的形式在网络上传输。因此修改点就在第二季的sample中将码流保存为裸流文件的代码处。

B、根据第二季8:保存编码得到的码流,我们应该在“ step2_5 :SAMPLE_COMM_VENC_SaveStream ”函数里修改(为了简单没有修改这个函数名,但功能已经改变了),使它完成将码流数据以包的形式在网上传输的功能。我们在这个函数之前进行一些初始化,因此在step2之前添加以下代码。我们以宏的方式定义 LOCAL_HOST_IP 为192.168.1.20,而8080是端口号。这也是VLC的sdp文件内容(见本文最后)为什么是那样的原因。

   #if ORTP_ENABLE/***rtp init****/pRtpSession = rtpInit( LOCAL_HOST_IP ,8080);  if (pRtpSession==NULL)   {   printf( "error rtpInit" ); exit(-1);  return  0;   } #endif/******************************************step 2:  Start to get streams of each channel.******************************************/while (HI_TRUE == pstPara->bThreadStart){//……}

C、修改SAMPLE_COMM_VENC_SaveStream函数,落实到最后,是修改SAMPLE_COMM_VENC_SaveH264函数。
 

/******************************************************************************
* 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 ORTP_ENABLE  //添加这个rtpSend(pRtpSession,pstStream->pstPack[i].pu8Addr, pstStream->pstPack[i].u32Len);#elsefwrite(pstStream->pstPack[i].pu8Addr+pstStream->pstPack[i].u32Offset,pstStream->pstPack[i].u32Len-pstStream->pstPack[i].u32Offset, 1, fpH264File);fflush(fpH264File);#endif}return HI_SUCCESS;
}

D、其中B和C中 rtpInit、rtpSend函数,是我们在sampl_comm_ven.c文件中新添加的函数,它们的调用关系如下。

这些函数的详细分析见博客第三季2:ORTP库与RTP发送实验的源码分析。

rtpInitortp_init//以下都是ORTP的库函数ortp_scheduler_initortp_set_log_level_maskrtp_session_newrtp_session_set_scheduling_modertp_session_set_blocking_modertp_session_set_remote_addrrtp_session_set_payload_typertp_session_set_ssrc
rtpSendrtp_session_send_with_ts//这个是ORTP的库函数

2、重新编译sample

(1)将/tmp/ortp/include/ortp这个目录复制到mpp/include/目录中。切记,复制的是目录而不是里面的文件!如果复制里面的文件,因为一些文件包含是以“ortp/xxx.h”方式的,会提示找不到xxx.h文件。

root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/include# cp /tmp/ortp/include/ortp ./ -rf
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/include# 

(2)修改mpp/sample/venc/目录下的Makefile,即添加libortp的链接支持。

$(TARGET):%:%.o $(COMM_OBJ)
#    $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS)$(CC) $(CFLAGS) -lpthread -lm -lortp -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) -L/tmp/ortp/lib
clean:@rm -f $(TARGET)@rm -f $(OBJ)@rm -f $(COMM_OBJ)

(3)在mpp/sample/venc/目录下执行“make”,可得到sample_venc可执行文件。

root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/sample/venc# ls
Makefile  sample_venc  sample_venc.c  sample_venc.o
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/sample/venc# 

3、开发板中部署并运行测试

(1)将/tmp/ortp/lib/libortp.so*这些文件复制到开发板中/usr/lib目录中。

(2)检查开发板中的配置是否正确,比如/mpp/sample/Makefile.param中的sensor等内容是否对应实际。

(3)将生成的sample_venc文件拷贝到虚拟机/home/xjh/iot/hisi_development/hisi_rootfs/目录中,然后将该目录挂载到板载系统的/mnt目录,在板载系统的/mnt目录下执行“./sample_venc 0”,然后输入c,此时SCRT中显示如下。

(4)在VLC播放器中,选择媒体,打开文件,选择sdp文件(提取码ms4a)。

m=video 8080 RTP/AVP 96
a=rtpmap:96 H264
a=framerate:25
c=IN IP4 192.168.1.20# sdp文件是VLC软件的配置文件,它告诉VLC播放器接收到的数据是怎样的。
# m=vidio,表示这是视频信息;8080是端口;
# RTP/AVP 96,表明传输过来的网络协议;96表示是h264的。
# a=framerate:25 这表示帧率;
# c=IN IP4 192.168.1.20 表示VLC所在主机的IP地址(window的ip地址)

注意这里之所以是192.168.1.20,是因为sample_common_venc.c文件中规定windows主机的ip地址就是这个(我们自己添加与修改的),因此我们要将主机的ip地址手动设置成这个。

#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" //这里我们自己添加的

(5)此时如果能看到实时图像(有延迟)就证明整个实验完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cocos2d-x实例学习之常用类及其概要作用

CCLayer,CCScene CCLayer类对应cocos2d-x引擎里的布景。每个游戏场景中都可以有很多层&#xff0c;每一层负责各自的任务&#xff0c;例如专门负责显示背景、专门负责显示道具和专门负责显示人物角色等。在每个层上面可以放置不同的元素&#xff0c;包括文本、精灵和菜单等。CC…

HTML能用作网页开发语言吗,[单选题] 以下语言本身不能作为网页开发语言的是(  )。...

参考解析&#xff1a;(1)【解题步骤】步骤1&#xff1a;通过“答题”菜单打开WORD1.DOCX文件&#xff0c;按题目要求替换文字。选中全部文本(包括标题段)&#xff0c;在【开始】功能区的【编辑】分组中&#xff0c;单击“替换”按钮&#xff0c;弹出“查找和替换”对话框。在“…

第三季2:ORTP库与RTP发送实验的源码分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 本文首先分析ORTP库的组成&#xff0c;然后以rtpsend.c为例说明ORTP库的使用方法&#xff0c;最后分析第三季1中的RTP发送实验的源码。 一、ORTP库的源码分析 1、ORTP库概览 &#xff08;1&#…

线程让出实验【RT-Thread学习笔记 4】

API: rt_thread_yield 线程函数中调用&#xff0c;本线程释放MCU。如果此时有别的相同优先级的任务整处于等待状态&#xff0c;将获得MCU使用权。 线程让出就是给OS增加一个任务调度的机会。 创建两个线程&#xff0c;观察他们的结果&#xff1a; //线程让出试验 void yield_te…

你或许不了解的C++函数调用(1)

这篇博客名字起得可能太自大了&#xff0c;搞得自己像C大牛一样&#xff0c;其实并非如此。C有很多隐藏在语法之下的特性&#xff0c;使得用户可以在不是特别了解的情况下简单使用&#xff0c;这是非常好的一件事情。但是有时我们可能会突然间发现一个很有意思的现象&#xff0…

有赞下拉菜单html,有赞vant-ui Tabs、List、PullRefresh组件实践

Vant ui Vue.js 部分组件实践功能需求是实现一个移动端的栏目列表切换&#xff0c;于此同时列表需要进行下拉刷新&#xff0c;上拉加载如下图&#xff0c;大概是一个这样的东西看起来是挺简单的&#xff0c;实现起来很方便。没错&#xff0c;我当时也是这么想的&#xff0c;结…

第五季1:AP模式USB-WIFI网卡移植与测试

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 内容总结 &#xff08;1&#xff09;HI3518EWIFI做AP&#xff0c;PC做STA&#xff0c;实现局域网内ortp视频传输。 &#xff08;2&#xff09;HI2518EWIFI做STA&#xff0c;PC做STA&#xff0c;外部…

免费社交类图标集

免费下载 这是一套免费社交类型的图标集&#xff0c;包含35种不同内容的图标。包括当前最热的Instagram&#xff0c;Evernatoe等。和往常推荐的一样&#xff0c;PSD文件可自行调整大小,50*50像素。它们可以被用在商业项目上&#xff0c;如果你也喜欢相关类型的图标&#xff0c;…

如何把图片嵌到html中,自给自足,轻松将图片图片内嵌到HTML

自给自足&#xff0c;轻松将图片图片内嵌到HTML1.为什么要将图片内嵌到HTML&#xff1f;针对于这个问题&#xff0c;我们有如下几种答案1)能减少并发请求&#xff0c;适合且合理的使用&#xff0c;能提高网站的访问速度2)便于分享&#xff0c;完全可以将需要的图片&#xff0c;…

第五季2:STA模式USB-WIFI网卡移植与测试

以下内容源于朱有鹏课程&#xff0c;如有侵权&#xff0c;请告知删除。 参考博客 hisi3518ev200移植MT7601_fsczp的博客-CSDN博客 wpa_supplicant移植与使用_andylauren的博客-CSDN博客 Linux wpa_cli 调试方法_weixin_34168700的博客-CSDN博客 12 海思Hi3518E移植WIFI驱动(ST…

关于ping命令的工作原理

2019独角兽企业重金招聘Python工程师标准>>> 当我们在用ping命令ping地址的时候会向target主机发送一个ICMP协议中的echo包&#xff0c;如果对方living&#xff08;活动状态&#xff09;。 则会返回一个echo包。 TTL的值&#xff1a;这个值对我们有什么用&#xff0…

SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)

【题意】给出一个无向图&#xff0c;每个点有一个标号mark[i]&#xff0c;不同点可能有相同的标号。对于一条边(u, v)&#xff0c;它的权值定义为mark[u] xor mark[v]。现在一些点的标号已定&#xff0c;请决定剩下点的标号&#xff0c;使得总的边权和最小。&#xff08;0 <…

第七季1:分析MP4文件封装格式

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 &#xff08;1&#xff09;mp4文件格式解析 - nigaopeng - 博客园&#xff08;推荐&#xff09; &#xff08;2&#xff09;你真的懂 MP4 格式吗&#xff1f; &#xff08;3&#xff09;m…

ESXi主机管理内存资源的方式

因为内存通常是最有限的资源&#xff0c;ESXi采用内存过量配置&#xff08;Memory overcommitment&#xff0c;即配置后的虚拟机内存可能超过物理内存&#xff08;RAM&#xff09;&#xff09;对内存进行管理。使用内存过量配置时&#xff0c;ESXi必须使用技术从一个或多个VM中…

第七季2:移植MP4v2库 与 将H.264码流打包成MP4格式的文件

以下内容源于朱有鹏课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 本文首先移植MP4V2库&#xff0c;然后运行修改后的sample代码以生成MP4文件。 利用MP4v2库&#xff0c;可以将编码方式为H264的视频码流打包、封装为MP4格式的文件。 一、移植MP4v2库 1、下载MP4…

新高考不选物理可以学计算机吗,新高考选科中物理真的那么重要吗?没有选物理是不是完了?...

文/圆梦志愿 伏老师众所周知&#xff0c;选科是我国新高考中最重要的事情之一&#xff0c;且涉及到了多门选考科目。其中&#xff0c;要数物理的话题性相对最强。那么&#xff0c;高考选科是不是物理特别重要&#xff1f;新高考没有选物理是不是完了&#xff1f;一、高考选科是…

参加第三届信息化创新克拉玛依国际学术论坛

据老孙说前二届在克拉玛依的数字油田的会议规格很高&#xff0c;可惜一直没机会参加。2014年9月3日至4日举办第三届&#xff0c;无论如何抓住了这次机会&#xff0c;不过会议的内容有些让我失望&#xff0c;克拉玛依的心思已经放在数字城市上了&#xff0c;数字油田的主题被冲淡…

UNICODE,GBK,UTF-8区别

简 单来说&#xff0c;unicode&#xff0c;gbk和大五码就是编码的值&#xff0c;而utf-8,uft-16之类就是这个值的表现形式&#xff0e;而前面那三种编码是一兼容的&#xff0c;同一个汉字&#xff0c; 那三个码值是完全不一样的&#xff0e;如&#xff02;汉&#xff02;的unco…

学生使用计算机中怎么关机,学会正确开关机初中计算机教案

第1篇&#xff1a;学会正确开关机初中计算机教案学会正确开、关机教案教学目的和要求学会开、关机教学难点&#xff1a;1、了解计算机外设的开、关顺序2、正确学会开、关机教学准备&#xff1a;计算机、网络教学过程()&#xff1a;一、教学导入同学们&#xff0c;在你们面前看到…

Telnet远程登录 与 海思proc文件系统

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c; 如有侵权请告知删除。 内容总结 &#xff08;1&#xff09;添加“ telnet远程登录 ”这种调试方式。 &#xff08;2&#xff09;介绍“ 海思proc文件系统 ”这种调试接口。 一、telnet远程登录 1、telnet远程登录的意…