视频网络传输的2种方式
1、基于下载:http or ftp
2、基于实时:RTP/RTSP/RTCP Real-time Transport Protocol
RTP介绍
1、openRTP,用C实现的一个RTP库(也有C++、JAVA等实现)
2、实质是一个视频服务器,工作时客户端和服务器实时传递视频数据
3、一般认为RTP工作在传输层(其实RTP比TCP/UDP高一个层次)
4、RTP(及RTCP)的实现有国际标准RFC3550规定,只要符合协议谁都可以自己写一个
1、ORTP库的移植
1、ORTP的引入
为什么要使用RTP
github上的ortp库镜像:Linphone.org mirror for ortp (git://git.linphone.org/ortp.git)
ORTP库的API
1.1、源码修改
(1)ortp库需要增加对H.264的payload支持(默认payload不包含H264)
在src/avprofile.c中357行添加:
rtp_profile_set_payload(profile,96,&payload_type_h264);
1.2、配置和编译
安装前置软件
配置ortp库需要的默认编译环境
进入ortp目录执行./autogen.sh 配置默认的编译环境
//嵌入式系统—定制化→→默认很多东西是没有的,需要自己额外安装的,比如下面ortp需要安装的一系列东西:
(1)错误1:./autogen.sh: line 44: libtoolize: command not found
解决:sudo apt-get install libtool*
(2)错误2:libtoolize: error: Please install GNU M4, or 'export M4=/path/to/gnu/m4'.
解决:sudo apt-get install m4
(3)错误3:Automake - aclocal: command not found
解决:sudo apt-get install automake (主要用于创建makefile)
设置存放目录prefix、交叉编译工具链host
ortp库配置:./configure --prefix=/tmp/ortp --host=arm-hisiv300-linux
(1)–prefix参数是强制设定install之后生成文件的存放目录,加上这个参数有利于将输出文件统一拷贝到开发板上
(2)–host参数要与交叉编译器名称对应,我用的交叉编译器是arm,但经测试发现此名称无法识别,因此改为了arm交叉编译通用名称arm-hisiv300-linux(注意:此参数一定要加,否则交叉编译不会成功,且是自己建立的符号链接)
成功后得到的ortp库文件:
到/tmp/ortp目录下查看移植好的库和头文件
安装目录下包括:
1、lib/👉包括.so .a
2、include/ortp/👉包括.h
部署(取决于.c和makefile)
头文件要放在编写主makefile时,指定的include下,比如海思项目,如下所示,根据sample_comm_venc.c调用头文件的方式,和makefile里面include包含路径,可知移植的库的头文件要放在mpp下,common之上的目录,即mpp/include/才行,与调用ortp库的c文件所在位置和makefile有关
静态编译:将静态库.a链接到可执行文件中去,运行时不依赖链接库。
文件体积大
动态编译:编译时不用库,运行时调用动态库.so的支持,编译快,
文件体积小
这里貌似是默认的动态编译,编译时使用了头文件,运行前要提前部署(在指定位置放好)好动态文件
开发板中部署并运行测试
(1)部署libortp.so到开发板中/usr/lib目录下 (.so动态库文件)
该位置一定已经包含在环境变量中了
(2)etc/profile中:(于开机时生效)设置ip并挂载nfs+mpp要加载特定模块(设计sensor型号)
(3)挂载nfs后进入相应位置→运行新的sample程序
(4)vlc中打开配置好的sdp文件,看到实时图像就证明整个实验完成了
3.4.1、ORTP库概览
//本身没有main函数
src目录下: 功能函数
src/tests/: 使用案例
include/ortp/: 相关数据结构和头文件
(4)ortp实现了rtp和rtcp协议,前者负责传输,后者负责控制和同步协调
3.4.2、ORTP库的使用案例
(1)src/tests/rtpsend.c
(2)ortp_init及av_profile_init
(3)ortp_scheduler_init和ORTP调度器:一个任务中完成多个会话的发送和接收,类似于select
(4)rtp_session_new和rtp的会话管理
rtp的会话session
rtp通过会话来管理数据发送和接收
//会话的本质是一个结构体,管理很多信息
创建会话: rtp_session_new
rtp发送: rtp_session_send_with_ts
底层真正干活的还是socket接口那一套,参考rtpsession_inet.c
3.4.4、ORTP的一些小细节
(1)port.c中对OS的常用机制(任务创建和销毁、进程管理和信号量等)进行了封装,便于将ortp移植到不同平台中
2、utils.c中实现了一个双向链表
3、str_util.c中实现了一个队列管理