Live555 實時接收RTSP碼流儲存為H264檔案
阿新 • • 發佈:2019-01-08
一、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幀結構