live555源码中,testRTSPClient.cpp默认只打印下接收的信息就收工了. 需要修改DummySink::afterGettingFrame,在其中增加00 00 00 01 以及获取sps pps添加到相应位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
unsigned char *pH264 = NULL; // 数据buffer void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned /*durationInMicroseconds*/) { printf("__FUNCTION__ = %s\n", __FUNCTION__ ); if(0 == strncmp(fSubsession.codecName(), "H264", 16)) { unsigned char nalu_header[4] = { 0, 0, 0, 1 }; unsigned char extraData[256]; unsigned int num = 0; pH264 = (unsigned char*)malloc(256*1024); SPropRecord *pSPropRecord; pSPropRecord = parseSPropParameterSets(fSubsession.fmtp_spropparametersets(), num); unsigned int extraLen; extraLen = 0; //p_record[0] is sps //p+record[1] is pps for(unsigned int i = 0; i < num; i++){ memcpy(&extraData[extraLen], &nalu_header[0], 4); extraLen += 4; memcpy(&extraData[extraLen], pSPropRecord[i].sPropBytes, pSPropRecord[i].sPropLength); extraLen += pSPropRecord[i].sPropLength; }/*for i*/ memcpy(&extraData[extraLen], &nalu_header[0], 4); extraLen += 4; delete[] pSPropRecord ; memcpy(pH264, &extraData[0], extraLen); memcpy(pH264 + extraLen, fReceiveBuffer, frameSize); int totalSize; totalSize = extraLen + frameSize; static FILE *fp = fopen("saved.h264", "wb"); fwrite(pH264, 1, totalSize, fp); fflush(fp); printf("\tsaved %d bytes\n", totalSize); free(pH264); }/*if 0 == strncmp(fSubsession.codecName(), "H264", 16)*/ // Then continue, to request the next frame of data: continuePlaying(); } |