HarmonyOS 鸿蒙Next 从AVCodec Kit进行摄像头采集后编码,提取H264码流保存成文件,264码流不可用
从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