HarmonyOS 鸿蒙Next 摄像头采集到编码后的H264码流如何提取

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

HarmonyOS 鸿蒙Next 摄像头采集到编码后的H264码流如何提取

void OnNewOutputBuffer(OH_AVCodec *codec, uint32_t index, OH_AVBuffer *buffer, void *userData) {
    if (userData == nullptr) {
        return;
    }
    (void)codec;
    OH_AVCodecBufferAttr info;
    int32_t ret = OH_AVBuffer_GetBufferAttr(buffer, &info);
    if (ret != AV_ERR_OK) {
        // 异常处理
        gf_OnNapiLog(LogRtpNapiLevel::RTP_NAPI_ERROR, "@@@ OH_AVBuffer_GetBufferAttr(%d)",ret);
    }
    CodecUserData *codecUserData = static_cast<CodecUserData*>(userData);
    std::unique_lock<std::mutex> lock(codecUserData->outputMutex);
    codecUserData->outputBufferInfoQueue.emplace(index, buffer);
    codecUserData->outputCond.notify_all();
}
void CRtcVideoCapture::EncOutputThread() {
   //AVCODEC_SAMPLE_LOGE("====== Recorder::EncOutputThread()======");
    while (true) {
        CHECK_AND_BREAK_LOG(_bStart, "Work done, thread out");
        std::unique_lock<std::mutex> lock(encContext_->outputMutex);
        bool condRet = encContext_->outputCond.wait_for(
            lock, 5s, [this]() { return !_bStart || !encContext_->outputBufferInfoQueue.empty(); });
        CHECK_AND_BREAK_LOG(_bStart, "Work done, thread out");
        CHECK_AND_CONTINUE_LOG(!encContext_->outputBufferInfoQueue.empty(),
                               "Buffer queue is empty, continue, cond ret: %{public}d", condRet);

        CodecBufferInfo bufferInfo = encContext_->outputBufferInfoQueue.front();
        encContext_->outputBufferInfoQueue.pop();
        CHECK_AND_BREAK_LOG(!(bufferInfo.attr.flags & AVCODEC_BUFFER_FLAGS_EOS), "Catch EOS, thread out");
        lock.unlock();
        if ((bufferInfo.attr.flags & AVCODEC_BUFFER_FLAGS_SYNC_FRAME) ||
            (bufferInfo.attr.flags == AVCODEC_BUFFER_FLAGS_NONE)) {
            encContext_->outputFrameCount++;
            bufferInfo.attr.pts = encContext_->outputFrameCount * MICROSECOND / sampleInfo_.frameRate;
        } else {
            bufferInfo.attr.pts = 0;
        }
        AVCODEC_SAMPLE_LOGE("Out buffer count: %{public}u, size: %{public}d, flag: %{public}u, pts: %{public}" PRId64,
                            encContext_->outputFrameCount, bufferInfo.attr.size, bufferInfo.attr.flags,
                            bufferInfo.attr.pts);
        //... 如何提取bufferInfo.buffer中H264的裸流

        int32_t ret = videoEncoder_->FreeOutputBuffer(bufferInfo.bufferIndex);
        CHECK_AND_BREAK_LOG(ret == AVCODEC_SAMPLE_ERR_OK, "Encoder output thread out");
    }
    AVCODEC_SAMPLE_LOGE("Exit, frame count: %{public}u", encContext_->outputFrameCount);
    StartRelease();
}

更多关于HarmonyOS 鸿蒙Next 摄像头采集到编码后的H264码流如何提取的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 摄像头采集到编码后的H264码流如何提取的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,若要从摄像头采集并编码后的H264码流中提取数据,通常涉及以下几个步骤:

  1. 摄像头数据采集:

    • 使用鸿蒙系统提供的摄像头API进行视频数据采集。这些API会提供原始的视频帧数据。
  2. 视频编码:

    • 将采集到的原始视频帧数据通过H264编码器进行编码。鸿蒙系统可能内置了H264编码库,或者你可以使用第三方编码库。
  3. 码流提取:

    • 编码完成后,H264编码器会输出编码后的码流。这个码流通常是以NAL单元(Network Abstraction Layer Units)的形式存在的。
    • 你可以通过访问编码器的输出缓冲区来获取这些NAL单元,它们包含了H264编码后的视频数据。
  4. 处理或传输码流:

    • 一旦提取到H264码流,你可以根据需求对其进行处理(如存储、解码或传输)。

需要注意的是,具体的API调用和数据处理方式可能会根据鸿蒙系统的版本和摄像头的硬件特性有所不同。

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

回到顶部