如何发送和接收RTP包,用FFmpeg分离、解码

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值