Live555 实时接收RTSP码流保存为H264文件

一、openRTSP

运行

./openRTSP -f 25 -w 1280 -h 720 "rtsp://192.168.1.139:8554/stream_chn0.264"

二、testRTSpClient

 修改testRTSpClient.cpp

int firstFrame=1;
  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";
  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: " << (unsigned)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
  }
  envir() << "\n";
#endif
  
  //todo one frame
  //save to file
  if(!strcmp(fSubsession.mediumName(), "video"))
  {
 if(firstFrame)
 {
 unsigned int num;
 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.h264", "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 = 0;
 }
 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;
 }
  }
  // Then continue, to request the next frame of data:
  continuePlaying();
}

 编译运行

rtsp://192.168.1.10/stream_chn0.264
./testRTSPClient rtsp://192.168.1.10/stream_chn0.264

注意:

1、对于H264码流,VLC播放器只支持.h264后缀,一点都不能错否则无法播放

2、笔者用Live555的mediaplaer做RTSP服务器,保存的h264码流可以通过VLC播放器正常播放,注意第一点

3、笔者用海思IPC做RTSP服务器,保存的h264码流需要修改第四字节为 67,才能正常播放,具体原因请仔细查看h264帧结构

猜你喜欢

转载自www.cnblogs.com/ordinary-world/p/10241333.html