HarmonyOS 鸿蒙Next 从AVCodec Kit进行摄像头采集后编码,提取H264码流保存成文件,264码流不可用

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

从VideoEncoder::OnNewOutputBuffer事件中,获得压缩的媒体流,通过下面函数,写入文件,使用ffplay.exe无法播放:

bool FindStartCode(const uint8_t* data, int32_t size, int32_t& startCodeLength) {
    if (size >= 4 && data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00 && data[3] == 0x01) {
        startCodeLength = 4;
        return true;
    } else if (size >= 3 && data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x01) {
        startCodeLength = 3;
        return true;
    }
    return false;
}

std::vector<std::vector<uint8_t>> ExtractH264Nalus(const uint8_t* data, int32_t size) {
    std::vector<std::vector<uint8_t>> nalus;
    int32_t startCodeLength = 0;
    int32_t pos = 0;

    while (pos < size) {
        // 查找起始码
        if (FindStartCode(data + pos, size - pos, startCodeLength)) {
           int32_t naluStart = pos;
           pos += startCodeLength; // 跳过起始码
           int32_t nalType =  *(data + pos) & 0x1F;

            // 查找下一个起始码
            while (pos < size) {
                if (FindStartCode(data + pos, size - pos, startCodeLength)) {
                    break;
                }
                pos++;
            }

            // 提取 NALU 数据
            if (naluStart < pos) {
                std::vector<uint8_t> nalu(data + naluStart, data + pos);
                nalus.push_back(nalu);
            }
        } else {
            pos++;
        }
    }

    return nalus;
}
//分割提取H264码流,并写入文件
std::vector<std::vector<uint8_t>> nalus = ExtractH264Nalus(_buffer, length);
    // 处理 NALU
#ifdef DEBUG_SENDER
    for (const auto& nalu : nalus) {
        // 这里可以对每个 NALU 进行处理,例如解码或保存到文件
            uint8_t buffer[8192];
            std::copy(nalu.begin(), nalu.end(), buffer);
            if (videoH264File_.is_open()) {
                videoH264File_.write((const char *)buffer,nalu.size());    
            }
    }
#endif  

更多关于HarmonyOS 鸿蒙Next 从AVCodec Kit进行摄像头采集后编码,提取H264码流保存成文件,264码流不可用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

麻烦提供下相关的报错信息

更多关于HarmonyOS 鸿蒙Next 从AVCodec Kit进行摄像头采集后编码,提取H264码流保存成文件,264码流不可用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,从AVCodec Kit进行摄像头采集后编码并提取H264码流保存为文件时,若生成的H264码流不可用,可能的原因及解决方法包括:

  1. 编码参数配置错误:检查AVCodec Kit编码参数设置,确保编码格式、分辨率、码率、帧率等配置正确无误,且与摄像头采集参数匹配。

  2. 码流写入文件方式有误:验证码流数据写入文件的逻辑,确保数据完整性且未发生数据丢失或错位。检查文件写入缓冲区大小、写入频率等是否合适。

  3. 文件头信息缺失:H264码流文件通常需要包含SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)等关键信息作为文件头。确认这些信息是否被正确写入文件开头。

  4. 同步问题:确保摄像头采集、编码及文件写入过程间的同步性,避免数据时序错乱。

  5. 硬件兼容性:检查所用硬件平台是否支持当前编码配置,以及是否存在已知的硬件兼容性问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部