bool MP4Encoder:: PraseMetadata(const unsigned char* pData,int size,MP4ENC_Metadata &metadata) { if(pData == NULL || size<4) { return false; } MP4ENC_NaluUnit nalu; int pos = 0; bool bRet1 = false,bRet2 = false; while (int len = ReadOneNaluFromBuf(pData,size,pos,nalu)) { if(nalu.type == 0x07) { memcpy(metadata.Sps,nalu.data,nalu.size); metadata.nSpsLen = nalu.size; bRet1 = true; } else if((nalu.type == 0x08)) { memcpy(metadata.Pps,nalu.data,nalu.size); metadata.nPpsLen = nalu.size; bRet2 = true; } pos += len; } if(bRet1 && bRet2) { return true; } return false; }
int CFfmpegDecode::PraseMetadata(const unsigned char* pData, int size,MP4ENC_Metadata &metadata) { if(pData == NULL || size<4) { return -1; } MP4ENC_NaluUnit nalu; int pos = 0; bool bRet1 = false,bRet2 = false; while (int len = ReadOneNaluFromBuf(pData,size,pos,nalu)) { if(nalu.type == 0x07) { memcpy(metadata.Sps,nalu.data,nalu.size); metadata.nSpsLen = nalu.size; bRet1 = true; //h264_decode_sps(pData, size, m_nWidth, m_nHeight); } else if((nalu.type == 0x08)) { memcpy(metadata.Pps,nalu.data,nalu.size); metadata.nPpsLen = nalu.size; bRet2 = true; } pos += len; } if (!bRet1) return -2; if (!bRet2) return -3; return 0; }
int MP4Encoder::WriteH264Data(MP4FileHandle hMp4File,const unsigned char* pData,int size) { if(hMp4File == NULL) { return -1; } if(pData == NULL) { return -1; } MP4ENC_NaluUnit nalu; int pos = 0, len = 0; while (len = ReadOneNaluFromBuf(pData,size,pos,nalu)) { if(nalu.type == 0x07) // sps { // 添加h264 track m_videoId = MP4AddH264VideoTrack (hMp4File, m_nTimeScale, m_nTimeScale / m_nFrameRate, m_nWidth, // width m_nHeight, // height nalu.data[1], // sps[1] AVCProfileIndication nalu.data[2], // sps[2] profile_compat nalu.data[3], // sps[3] AVCLevelIndication 3); // 4 bytes length before each NAL unit if (m_videoId == MP4_INVALID_TRACK_ID) { printf("add video track failed.\n"); return 0; } MP4SetVideoProfileLevel(hMp4File, 1); // Simple Profile @ Level 3 MP4AddH264SequenceParameterSet(hMp4File,m_videoId,nalu.data,nalu.size); } else if(nalu.type == 0x08) // pps { MP4AddH264PictureParameterSet(hMp4File,m_videoId,nalu.data,nalu.size); } else { int datalen = nalu.size+4; unsigned char *data = new unsigned char[datalen]; // MP4 Nalu前四个字节表示Nalu长度 data[0] = nalu.size>>24; data[1] = nalu.size>>16; data[2] = nalu.size>>8; data[3] = nalu.size&0xff; memcpy(data+4,nalu.data,nalu.size); if(!MP4WriteSample(hMp4File, m_videoId, data, datalen,MP4_INVALID_DURATION, 0, 1)) { return 0; } delete[] data; } pos += len; } return pos; }