leikko 2019-11-26 09:30 采纳率: 0%
浏览 207
已结题

android 使用MP4V2第二次写入数据失败

在使用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;
}
到底是哪里出错了

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 6月16日

    悬赏问题

    • ¥15 arduino控制ps2手柄一直报错
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥85 maple软件,solve求反函数,出现rootof怎么办?
    • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
    • ¥65 汇编语言除法溢出问题
    • ¥15 Visual Studio问题
    • ¥20 求一个html代码,有偿