在使用MP4V2录制H264流时,第一次录制没问题,但是第二次点击播放视频步骤没变还是
MP4EncoderHelper.init(FileConstant.mp4FilePath, 1280, 720);成功并且生成文件
MP4EncoderHelper.writeH264Data(datas, datas.length);写入数据失败
MP4EncoderHelper.close();关闭也没错
到了写入数据这里
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)) {
LOGI("nalu.type: %d", nalu.type);
if (nalu.type == 0x07) // sps
{
if (m_videoId == MP4_INVALID_TRACK_ID) {
// 添加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
MP4SetVideoProfileLevel(hMp4File, 0x01); // Simple Profile @ Level 3 1
}
if (m_videoId == MP4_INVALID_TRACK_ID) {
printf("add video track failed.\n");
return 0;
}
MP4AddH264SequenceParameterSet(hMp4File, m_videoId, nalu.data, nalu.size);
} else if (nalu.type == 0x08) // pps
{
MP4AddH264PictureParameterSet(hMp4File, m_videoId, nalu.data, nalu.size);
} else if (nalu.type == 0x05 || nalu.type == 0x01) {
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,
nalu.type == 0x05 ? 1 : 0)) {
return 0;
}
delete[] data;
}
pos += len;
}
return pos;
}
第一次录制MP4WriteSample()这个函数这里返回的都是true
第二次录制时,每次来到MP4WriteSample()这个函数这里返回的都是false,导致写入数据失败
if (!MP4WriteSample(hMp4File, m_videoId, data, datalen, MP4_INVALID_DURATION, 0,
nalu.type == 0x05 ? 1 : 0)) {
return 0;
}
到底是哪里出错了