以下内容源于朱有鹏课程,如有侵权,请告知删除。
本季课程重点在于使用ORTP库来实现局域网视频实时传输。
一、ORTP的介绍
1、视频网络传输的两种方式
(1)基于下载
- 比如http(Hyper Text Transfer Protocol 超文件传输协定);
- 比如ftp(File Transfer Protocol,文件传输协议);
- 如果网速慢就不会实时,如果网速大于播放速率则缓冲。
- 基于下载方式,能够保证视频质量。
(2)基于实时
- RTP、RTSP(S->steam,专门传输视频流的协议?)、RTCP(是对RTP的一种补充,因为RTP只有传输没有控制信息)。
- 应用于视频监控、直播等行业。
2、ORTP的介绍
(1)RTP(Real-time Transport Protocol,实时传输协议)是一个网络传输协议。RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。
(2)openRTP,即ORTP,是用C实现的一个RTP库(其实还有C++实现的,JAVA等实现的)。这句话意思是,RTP是一种协议,而ORTP是协议的软件实现(即写成库)。
(3)实质是一个视频服务器,工作时客户端和服务器实时传递视频数据。
- VLC播放器在这里即为客户端。
(4)一般认为RTP工作在传输层,但RTP其实比TCP/UDP高一个层次。
(5)RTP(及RTCP)的实现由国际标准RFC3550规定,只要符合协议谁都可以写一个RTP的实现。
二、ORTP库的移植
1、准备源码
(1)下载ortp源码:https://github.com/dmonakhov/ortp
- OPTP库里面最关键的是include,src和src/test这三个文件夹,相应的数据结构和头文件存放在include/ortp目录下;src里面实现了一些功能函数;src/test是示例代码。
- ORTP库实现了RTP和RTCP协议,前者负责传输视频,后者负载视频传输的质量控制、同步、协调等。

(2)将下载好的ortp-master.zip文件通过共享文件夹存放到ubuntu合适的目录,并解压。
- zip文件使用unzip命令解压。
- 这里解压到的目录是/root/hisidk/ortp-master。


2、源码修改
(1)增加H.264格式的payload支持。
- 在src/avprofile.c中357行添加:rtp_profile_set_payload(profile,96,&payload_type_h264);
- “:set nu” 显示行号
- “:357”表示定位到第357行

3、配置和编译、安装
(1)进入ortp目录(/root/hisidk/ortp-master/)执行./autogen.sh
错误1:./autogen.sh: line 44: libtoolize: command not found
- 解决:sudo apt-get install libtool*
- ubuntu得能够上网。配置方法:先桥接到无线网卡(我的个人电脑是如此),然后配置/etc/network/interfaces文件,改为dhcp的形式。
- GNU Libtool 可以容易的在不同的系统中建立动态链接库。它通过一个称为 Libtool 库的抽象,隐藏了不同系统之间的差异,给开发人员提供了一致的的接口。
错误2:libtoolize: error: Please install GNU M4, or 'export M4=/path/to/gnu/m4'.
- 解决:sudo apt-get install m4
- M4是一个宏处理器,将输入拷贝到输出,同时将宏展开。宏可以是内嵌的也可以是用户定义的。除了可以展开宏,M4还有一些内建的函数,用来引用文件,执行Unix命令,整数运算,文本操作,循环等。M4既可以作为编译器的前端也可以单独作为一个宏处理器。
错误3:Automake - aclocal: command not found
- 解决:sudo apt-get install automake
- 主要用于创建makefile。
(2)继续执行./configure --prefix=/tmp/ortp --host=arm-hisiv300-linux
- --host=arm-hisiv300-linux,指定了交叉编译工具链,所以工具链一定要安装好(安装好并导出环境变量PATH中)。
- --prefix=/tmp/ortp表示最后安装到/tmp/ortp此目录下。
(3)执行“make && make install”
4、查看移植完的库和头文件
- 在/tmp/ortp目录下。

至此,移植结束。
三、RTP传输视频
1、在官方SDK的sample中添加rtp传输代码
(1)在venc/sample_venc.c中添加:s32ChnNum = 1;
- 本来有三路的,现在强制限制为1路。因为只是为了演示,没必要弄那么麻烦。



(2)在common/sample_common_venc.c中改了很多内容。
忽略修改的过程,将修改后的的文件sample_common_venc.c【1111】覆盖原目录的文件即可。
2、重新编译sample
(1)复制ortp头文件
![]()
(2)修改venc中Makefile,以便添加libortp的链接支持
原来的:

改后的:

(3)执行make,得到sample_venc可执行文件。
3、开发板中部署并运行测试
(1)部署(即拷贝)libortp.so到开发板中/usr/lib目录下(通过nfs挂载方式)。
(2)检查开发板中原有配置是否正确,譬如sensor是否对应实际。
(3)通过nfs挂载方式,在板载系统中运行/mnt/./sample_venc 0
(4)vlc中打开(媒体—》打开文件—》选择sdp文件)配置好的sdp文件【提取码ms4a】,看到实时图像就证明整个实验完成了。
- 注意这里window主机的有线IP设置为192.168.1.20,因为sdp文件里面要求的。当然也可以更改,但要注意相同。

//这是VLC软件的配置文件,它告诉VLC播放器接收到的数据是怎样的。
//这里只是一些配置项目,其实还可以有很多。
/*
m=vidio表示这是视频信息 8080是端口 RTP/AVP表明传输过来的网络协议 96表示是h264的
a=rtpmap:96 H264
a=framerate:25 这表示帧率
c=IN IP4 192.168.1.20 表示VLC所在的IP地址(window的ip地址),而非远端的(远端的在报文中有自己的IP地址)
*/