使用LIVE555保存264文件,用vlc播放失败

介绍了live555中testProgs文件里可保存文件的两个测试程序。testRTSPclient.cpp可保存264文件,但不稳定,部分rtsp生成的文件用vlc打不开;playCommon.cpp能生成vlc可播放的264文件,不过需自行修改文件名并加后缀,否则vlc无法播放。

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

live555中testProgs文件有两个测试程序可以用来保存文件,分别是playCommon.cpp和testRTSPclient.cpp。

先来看testRTSPclient.cpp保存264文件的代码

void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes,
				  struct timeval presentationTime, unsigned /*durationInMicroseconds*/) {
  // We've just received a frame of data.  (Optionally) print out information about it:
#ifdef DEBUG_PRINT_EACH_RECEIVED_FRAME
  if (fStreamId != NULL) envir() << "Stream \"" << fStreamId << "\"; ";
  envir() << fSubsession.mediumName() << "/" << fSubsession.codecName() << ":\tReceived " << frameSize << " bytes";

//  envir() << fSubsession.rtpPayloadFormat() << "******";
  if (numTruncatedBytes > 0) envir() << " (with " << numTruncatedBytes << " bytes truncated)";
  char uSecsStr[6+1]; // used to output the 'microseconds' part of the presentation time
  sprintf(uSecsStr, "%06u", (unsigned)presentationTime.tv_usec);
  envir() << ".\tPresentation time: " << (int)presentationTime.tv_sec << "." << uSecsStr;
  if (fSubsession.rtpSource() != NULL && !fSubsession.rtpSource()->hasBeenSynchronizedUsingRTCP()) {
    envir() << "!"; // mark the debugging output to indicate that this presentation time is not RTCP-synchronized
  }
#ifdef DEBUG_PRINT_NPT
  envir() << "\tNPT: " << fSubsession.getNormalPlayTime(presentationTime);
#endif
  envir() << "\n";
#endif
 

#if 1 //nhh

  if ( 0 == strcmp(fSubsession.mediumName(),"video"))
  {

	
	  if (firstFrame)
	  {
		  unsigned int num = 2;
		  SPropRecord *sps = parseSPropParameterSets(fSubsession.fmtp_spropparametersets(), num);

		  // For H.264 video stream, we use a special sink that insert start_codes:
		  struct timeval tv = { 0,0 };
		  unsigned char start_code[4] = { 0x00, 0x00, 0x00, 0x01 };
		  FILE *fp = fopen("test.264", "a+b");
		  if (fp)
		  {
			  fwrite(start_code, 4, 1, fp);
			  fwrite(sps[0].sPropBytes, sps[0].sPropLength, 1, fp);
			  fwrite(start_code, 4, 1, fp);
			  fwrite(sps[1].sPropBytes, sps[1].sPropLength, 1, fp);
			  fclose(fp);
			  fp = NULL;
		  }
		  delete[] sps;
		  firstFrame = False;
	  }

	  char *pbuf = (char *)fReceiveBuffer;
	  char head[4] = { 0x00, 0x00, 0x00, 0x01 };
	  FILE *fp = fopen("test.264", "a+b");
	  if (fp)
	  {
		  fwrite(head, 4, 1, fp);
		  fwrite(fReceiveBuffer, frameSize, 1, fp);
		  fclose(fp);
		  fp = NULL;
	  }
  }



#endif
  // Then continue, to request the next frame of data:
  continuePlaying();
}

这套代码可以用来保存后缀264文件,但是不稳定,有的rtsp生成的文件用vlc打开不了,原因不明。

playCommon.cpp这套代码可以生成vlc播放的264文件,但是关键点在于你要自己修改保存文件的名字且要有后缀名(列如video.264),不然用vlc也是播不出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值