HarmonyOS 鸿蒙Next 怎么MP4文件解封装读取h264裸流

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

HarmonyOS 鸿蒙Next 怎么MP4文件解封装读取h264裸流 如题,我想从MP4文件中读取h264的裸流,然后按一帧一帧的打包成RTP包发送出去,我参考样例:https://gitee.com/harmonyos_samples/AVCodecVideo 代码,但是在以下是output线程的代码:

void ReadMp4::VideoDecOutputThread() {
    while (true) {
        thread_local auto lastPushTime = std::chrono::system_clock::now();
        CHECK_AND_BREAK_LOG(isStarted_, "Decoder output thread out");
        std::unique_lock<std::mutex> lock(videoDecContext_->outputMutex);
        bool condRet = videoDecContext_->outputCond.wait_for(
            lock, 5s, [this]() { return !isStarted_ || !videoDecContext_->outputBufferInfoQueue.empty(); });
        CHECK_AND_BREAK_LOG(isStarted_, "Decoder output thread out");
        CHECK_AND_CONTINUE_LOG(!videoDecContext_->outputBufferInfoQueue.empty(),
                               "Buffer queue is empty, continue, cond ret: %{public}d", condRet);

        CodecBufferInfo bufferInfo = videoDecContext_->outputBufferInfoQueue.front();
        videoDecContext_->outputBufferInfoQueue.pop();
        CHECK_AND_BREAK_LOG(!(bufferInfo.attr.flags & AVCODEC_BUFFER_FLAGS_EOS), "Catch EOS, thread out");
        videoDecContext_->outputFrameCount++;
        AVCODEC_SAMPLE_LOGW("Out buffer count: %{public}u, size: %{public}d, flag: %{public}u, pts: %{public}" PRId64,
                            videoDecContext_->outputFrameCount, bufferInfo.attr.size, bufferInfo.attr.flags,
                            bufferInfo.attr.pts);
        lock.unlock();
        
        napi_SendVideoOneFrame(
                reinterpret_cast<char*>(OH_AVBuffer_GetAddr(reinterpret_cast<OH_AVBuffer*>(bufferInfo.buffer)),
                bufferInfo.attr.size, "Playback", 0, ip, port);

        int32_t ret = videoDecoder_->FreeOutputBuffer(bufferInfo.bufferIndex, false);
        CHECK_AND_BREAK_LOG(ret == AVCODEC_SAMPLE_ERR_OK_, "Decoder output thread out");

        std::this_thread::sleep_until(lastPushTime + std::chrono::microseconds(sampleInfo_.frameInterval));
        lastPushTime = std::chrono::system_clock::now();
    }
    StartRelease();
}

但是这里bufferInfo.buffer返回的是固定大小的数据,不是SPS,PPS,I帧,P帧这样的一帧一帧的数据,请问哪里出错了吗?


更多关于HarmonyOS 鸿蒙Next 怎么MP4文件解封装读取h264裸流的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

你需要的应该是使用Player::VideoDecInputThread()才是播放的流程。

更多关于HarmonyOS 鸿蒙Next 怎么MP4文件解封装读取h264裸流的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,若要从MP4文件中解封装并读取H.264裸流,通常需要使用专门的媒体处理库或框架。由于鸿蒙系统支持多种编程语言和框架,这里提供一个基于FFmpeg库的方法,因为它是一个广泛使用的跨平台多媒体处理库,支持多种格式和解码。

  1. 集成FFmpeg库:首先,确保你的HarmonyOS项目已经集成了FFmpeg库。这通常涉及下载FFmpeg的源代码,编译适用于鸿蒙系统的版本,并将其链接到你的项目中。

  2. 使用FFmpeg解封装:利用FFmpeg提供的API,打开MP4文件,找到视频流,并读取H.264裸流数据。这通常涉及使用avformat_open_input打开文件,avformat_find_stream_info获取流信息,avcodec_find_decoderavcodec_open2找到并打开解码器,然后使用av_read_frame循环读取帧,并从中提取H.264数据。

  3. 处理H.264数据:一旦提取出H.264裸流,你可以将其传递给解码器进行解码,或者直接用于其他处理(如编码、传输等)。

请注意,FFmpeg的使用涉及较复杂的API调用和错误处理,这里仅提供了大致的步骤。具体实现需要参考FFmpeg的官方文档和示例代码。

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

回到顶部