第三季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,一经查实,立即删除!

相关文章

有赞下拉菜单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;…

第五季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…

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

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

第七季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;数字油田的主题被冲淡…

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

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

北邮-上机-提交错误解决及一些经验

2019独角兽企业重金招聘Python工程师标准>>> 1、出现Time Limit Exceed问题 答&#xff1a;三种原因&#xff1a;1、程序死循环或太多的循环&#xff1b;2、对极限状况计算量太大&#xff0c;需要优化程序&#xff0c;如对10000个以上进行排序必须使用快速排序&…

RAM、ROM和FLASH三大类常见存储器简介

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客&#xff1a; Flash、RAM、ROM的区别_天籁东东的博客-CSDN博客_flash和rom的区别 RAM、ROM和FLASH三大类常见存储器简介 - 存储技术 - 电子发烧友网 RAM、NANDFlash、NORFlash的区别详解 - 百度…

wangeditor html编辑,Vue整合wangEditor富文本编辑器

最近在做项目时&#xff0c;客户有个发布新闻动态的功能&#xff0c;具体页面内容让客户自己编写&#xff0c;所以要选择富文本编辑器&#xff0c;这样用户体验好一点。网上有很多的富文本编辑器&#xff0c; 因为项目的功能并不是很复杂&#xff0c;所以选择了wangEditor&…

DreamWeaver连接Tomcat用以编辑和测试JSP

2019独角兽企业重金招聘Python工程师标准>>> 3 、打开软件之后&#xff0c;大家选择【站点】中的【新建站点】 。 4 、填写要填的内容。 站点名称&#xff1a;可以随便起&#xff0c;只是用来区分站点用的。因为&#xff0c;可以建立多个站点。 本地根文件夹&…

2013多校第三场

hdu 4629 题意&#xff1a;给你n个三角形&#xff0c;问覆盖1~n次的面积各是多少&#xff0c;n < 50; 分析&#xff1a;取出所有端点和交点的x坐标&#xff0c;排序&#xff0c;然后对于每一段xi~xi1的范围的线段都是不相交的&#xff0c;所以组成的 面积要么是三角形&#…

TSS 任务状态段

TSS(任务状态段)1 什么是TSS TSS 全称task state segment&#xff0c;是指在操作系统进程管理的过程中&#xff0c;任务&#xff08;进程&#xff09;切换时的任务现场信息。 2 TSS工作细节 TSS在任务切换过程中起着重要作用&#xff0c;通过它实现任务的挂起和恢复。所谓…

Linux下C语言程序的内存布局

以下内容源于C语言中文网的内容学习与整理。如有侵权&#xff0c;请告知删除。 一、C语言内存布局 C程序所占用的内存&#xff0c;可以划分为以下几个部分。 1、栈区&#xff08;stack&#xff09;。由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量的值…

微型计算机频繁死机的原因,电脑经常死机是什么原因|电脑经常死机的解决方法...

‍‍电脑出现死机是很常见的一种故障&#xff0c;造成的原因也有很多种。而最近有些用户的电脑经常死机&#xff0c;开机几分钟就死机&#xff0c;有时还会出现蓝屏&#xff0c;这到底是怎么回事呢&#xff1f;电脑经常死机是什么原因呢&#xff1f;下面小编结合自己的实际情况…

PKI系统深入介绍

公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称PKI&#xff09;是眼下网络安全建设的基础与核心&#xff0c;是电子商务安全实施的基本保障&#xff0c;因此&#xff0c;对PKI技术的研究和开发成为眼下信息安全领域的热点。本文对PKI技术进行了全面的分析…

html 禁止缩放 ios10,完美解决ios10及以上Safari无法禁止缩放的问题

完美解决 ios10 及以上 Safari 无法禁止缩放的问题转载自掘金-互联网学徒移动端web缩放有两种&#xff1a;双击缩放双指手势缩放在 iOS 10之前&#xff0c;iOS 和 Android 都可以通过一行 meta 标签来禁止页面缩放&#xff1a;但 iOS 10开始&#xff0c;meta 设置在 Safari 内无…