HarmonyOS 鸿蒙Next 怎么MP4文件解封装读取h264裸流
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
在HarmonyOS鸿蒙Next系统中,若要从MP4文件中解封装并读取H.264裸流,通常需要使用专门的媒体处理库或框架。由于鸿蒙系统支持多种编程语言和框架,这里提供一个基于FFmpeg库的方法,因为它是一个广泛使用的跨平台多媒体处理库,支持多种格式和解码。
-
集成FFmpeg库:首先,确保你的HarmonyOS项目已经集成了FFmpeg库。这通常涉及下载FFmpeg的源代码,编译适用于鸿蒙系统的版本,并将其链接到你的项目中。
-
使用FFmpeg解封装:利用FFmpeg提供的API,打开MP4文件,找到视频流,并读取H.264裸流数据。这通常涉及使用
avformat_open_input
打开文件,avformat_find_stream_info
获取流信息,avcodec_find_decoder
和avcodec_open2
找到并打开解码器,然后使用av_read_frame
循环读取帧,并从中提取H.264数据。 -
处理H.264数据:一旦提取出H.264裸流,你可以将其传递给解码器进行解码,或者直接用于其他处理(如编码、传输等)。
请注意,FFmpeg的使用涉及较复杂的API调用和错误处理,这里仅提供了大致的步骤。具体实现需要参考FFmpeg的官方文档和示例代码。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html,