vs2019+vcpkg+live555实现RTSP客户端

最近有个小伙伴需要实现一个RTSP客户端,那么最简单的方法无疑就是用live555。可是引入时碰到了各种问题,于是找我帮忙,我来研究了一下。将中间遇到的问题一一记录。

1 初次编译

因为偷懒,就直接用vcpkg进行编译。

vcpkg install live555

发现编译不过,错误原因为std::atomic_flag不认识,遂百度,看到一篇文章,只要增加宏禁用STL即可。

由于vcpkg编译时是依赖CMake的,于是我就想在CMake的时候指定NO_STD_LIB

vcpkg edit live555

在打开的VSCode中,修改CMakeLists.txt,增加definitions即可

……
if (WIN32)
    add_definitions(-DNO_GETIFADDRS)
endif(WIN32)
#从这里开始加
add_definitions(-DNO_STD_LIB)

改完以后就可以编译通过了(看文章的童鞋请不要急着执行这步,看完全文最后再做)

vcpkg install --no-downloads --editable live555

2 测试DEMO

编译通过以后,可以看下源码目录下的testProgs/testRTSPClient.cpp,直接拿他建个工程就可以跑起来。

如果希望存流,稍作修改,即可存储到需要的视频码流、

  • 如果不要音频,最好的方法是不要订阅,这里不展开描述了
  • 视频是按NAL回调的,如果想关注一帧齐了,关注fSubsession.rtpSource() 是否是Marker位即可。
  • 也可以看我之前的文章live555+VS2013编译
void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes,
				  struct timeval presentationTime, unsigned /*durationInMicroseconds*/) {

  if (strcmp(fSubsession.mediumName(),"video") == 0)
  {
	  FILE* fd = fopen("./test.264", "ab");
	  if (fd)
	  {
		  char szHead[4] = { 0x00,0x00,0x00,0x01 };
		  fwrite(szHead, sizeof(szHead), 1, fd);
		  fwrite(fReceiveBuffer, frameSize, 1, fd);
		  fflush(fd);
		  fclose(fd);
	  }
  }
  
  
  // Then continue, to request the next frame of data:
  continuePlaying();
}

跑起来发现,I帧永远收不齐,很奇怪。
切换编码为多SLICE后,出现I帧部分NAL收齐,后续的NAL无法收到的情况。

3 解决I帧无法收齐问题

于是打断点进行了跟踪,发现单SLICE情况下,当I帧的那个NAL收到60多K后,RTP序号出现跳跃。
我们的RTSP是走的RTP over UDP的方案,且发送端未做平滑发送。因此怀疑是接收端缓冲区太小,I帧较大导致。

找到liveMedia/MultiFramedRTPSource.cpp。

MultiFramedRTPSource
::MultiFramedRTPSource(UsageEnvironment& env, Groupsock* RTPgs,
		       unsigned char rtpPayloadFormat,
		       unsigned rtpTimestampFrequency,
		       BufferedPacketFactory* packetFactory)
  : RTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency) {
  reset();
  fReorderingBuffer = new ReorderingPacketBuffer(packetFactory);

  // Try to use a big receive buffer for RTP:
  increaseReceiveBufferTo(env, RTPgs->socketNum(), 50*1024);
}

发现了要点,默认只分配了50k缓存,加大到512k

  increaseReceiveBufferTo(env, RTPgs->socketNum(), 512*1024);

修改完成后重新编译live555,再次运行,OK

#前面如果没有编译,就可以不用做remove了
vcpkg remove live555
vcpkg install --no-downloads --editable live555

4 后记

实际上小伙伴是使用的VS2010,拿我这份live555去自行编译了。vcpkg的好处在于能够带上CMake,大大简化编译过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值