RTP是网络上进行流媒体传输的一种常用协议,现在有很多封装RTP协议的开源库,比如:ortp, jrtplib,而其中最有名的要数jrtplib,本文给大家演示怎么用jrtplib开发一个带RTP发送和接收功能的应用程序,但这篇文章不会讲述jrtplib的基本用法知识,如果你要了解更多关于这个库的用法,可以参考这篇文章:http://www.cnblogs.com/yuweifeng/p/7550737.html。
本文给大家演示怎么开发一个基于RTP协议的流媒体播放器。播放器从网络上接收RTP包,解包后把视频分离出来,然后用FFmpeg解码,把图像显示出来。这个流媒体播放器实现的功能比较简单,但是实现了一个典型的网络播放器的框架。该文章涉及的开发知识和技巧包括:
1. 怎么用jrtplib发送数据;
2. 怎么使用jrtplib接收数据;
3. 怎么让ffmpeg从内存中读取流媒体数据,然后进行分离和解码;
4. 怎么用双线程技术同时接收和解码视频,提高播放的效率;
5. 怎么实现一个先入先出的缓冲队列存储收到的视频帧;
该播放器的代码下载地址:https://download.youkuaiyun.com/download/zhoubotong2012/10918971
这个播放器的界面如下所示:

这个播放器主要演示播放网络流的功能,但为了方便测试,也集成了发送流媒体的功能,界面上提供一个按钮选择一个视频文件,文件可以是H264、PS、TS等容器格式;然后,需要指定发送的目标IP和目标端口号,这里的IP可以选本机IP。点击发送,则程序会以RTP方式打包,通过UDP将数据发送到目标地址。在本程序的接收端,只需要配置接收端口,点击“开始接收“按钮则开始接收数据。注意:目标端口要和接收端口一致,发送和接收是一对一的。程序可以分布在两台机器上运行,一个作发送端,一个作接收端;也可以在一台机上测试发送和接收。
- 如何实现发送
首先,讲一下怎么实现发送流媒体的功能。我们需要创建一个RTPSession的发送对象,然后初始化相关的参数:
RTPSession session;
RTPSessionParams sessionparams;
sessionparams.SetOwnTimestampUnit(1.0 / 90000.0);
sessionparams.SetAcceptOwnPackets(true);
RTPUDPv4TransmissionParams transparams;
transparams.SetPortbase(8000); //这个端口必须未被占用
int status = session.Create(sessionparams, &transparams);
if (status < 0)
{
//std::cerr << RTPGetErrorString(status) << std::endl;
return - 1;
}
#if 1
RTPIPv4Address addr(ntohl(inet_addr(m_szDestIP)), m_nDestPort);
status = session.AddDestination(addr);
#else
unsigned long addr = ntohl(inet_addr(m_szDestIP));
status = session.AddDestination(addr, m_nDestPort);
#endif
if (status < 0)
{
//std::cerr << RTPGetErrorString(status) << std::endl;
return -2;
}
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(90000.0 / 25.0);
这里初始化的参数包括RTP头的Payload类型(赋值为96),时间单位(1.0/90000.0),时间戳增量(90000/25=3600),以及Rtp头的MarkerBit的默认值。
接着读取一个视频文件,每次读1K字节,然后调用jrtplib的RTPSession::SendPacket函数发送数据:
FILE *fp_open;
uint8_t buff[10

本文介绍了如何使用jrtplib库发送和接收RTP数据包,以及结合FFmpeg进行视频流的分离和解码。通过创建RTPSession对象发送数据,用双线程技术接收并解码视频,实现了一个简单的流媒体播放器。文章还提到了处理H264数据的特殊需求,并讨论了FFmpeg对某些格式的识别问题以及jrtplib的Poll函数性能问题。
最低0.47元/天 解锁文章
2134

被折叠的 条评论
为什么被折叠?



