您好,我看了您的文章,想付费请教您一个问题。我现在遇到的问题是:
已有条件:
1.我首先完成了在我的项目工程里完成了点亮mipi屏幕然后通过drm框架来播放图片和视频。目前已经实现了。
2.我也通过ffmpeg把MP4的视频通过指令行解码成完整的yuv视频数据,然后通过open方式实现在屏幕上播放视频。
问题:
1.我现在需要实现在项目里通过调用rk_mpp库的api进行边解码边输出帧数据通过drm播放,卡在了解码的这个部分。
尝试过的经历:
1.我尝试使用在rk_mpp这个git上直接拉下来的工程里进行编译,生成的test中的mpi_dec_test放在板卡执行,是可以正常的解码h264并实现输出yuv,
但是我把它编译生成的.a .so拿出来,头文件拿出来放到我的工程里,然后把mpi_dec_test的源代码放到我的主程序里面就编译它,已经把报错的依赖链接这些全部解决,但是编译出来的代码在mpp_init这里面进Segmentfault。
以下图片是目录结构

2.我又从gpt哪里生成一份代码,但总是卡在初始化的部分。
#include <stdio.h>
#include <stdlib.h>
#include "rk_mpi.h" // 确保包含正确的头文件
int main() {
MppCtx mpp_ctx = NULL;
MppApi *mpp_api = NULL; // 正确声明 mpp_api
MppPacket packet = NULL;
MppFrame frame = NULL;
FILE *h264_file = NULL;
size_t file_size = 0;
int ret = 0;
// 创建 MPP 上下文并初始化
ret = mpp_create(&mpp_ctx, &mpp_api); // 传递 mpp_api 指针
if (ret != MPP_OK) { // 使用正确的返回值常量
printf("MPP create failed\n");
return -1;
}
// 初始化 MPP(设置解码器为 H.264)
ret = mpp_init(mpp_ctx, MPP_CTX_DEC, MPP_VIDEO_CodingAVC);
if (ret != MPP_OK) { // 使用正确的返回值常量
printf("MPP init failed\n");
mpp_destroy(mpp_ctx); // 销毁上下文
return -1;
}
// 打开 H.264 文件并获取大小
h264_file = fopen("video.h264", "rb");
if (!h264_file) {
printf("Failed to open H.264 file\n");
mpp_destroy(mpp_ctx);
return -1;
}
fseek(h264_file, 0, SEEK_END);
file_size = ftell(h264_file);
fseek(h264_file, 0, SEEK_SET);
// 分配内存读取文件数据
unsigned char *h264_data = malloc(file_size);
if (!h264_data) {
printf("Memory allocation failed\n");
fclose(h264_file);
mpp_destroy(mpp_ctx);
return -1;
}
fread(h264_data, 1, file_size, h264_file);
fclose(h264_file);
// 创建数据包
ret = mpp_packet_init(&packet, h264_data, file_size);
if (ret != MPP_OK) { // 使用正确的返回值常量
printf("MPP packet init failed\n");
free(h264_data);
mpp_destroy(mpp_ctx);
return -1;
}
// 解码视频流(异步接口)
ret = mpp_api->decode(mpp_ctx, packet, &frame); // 解码接口
if (ret != MPP_OK) {
printf("Decode failed, error code: %d\n", ret); // 打印错误码
mpp_packet_deinit(&packet);
free(h264_data);
mpp_destroy(mpp_ctx);
return -1;
}
// 获取解码帧的缓冲区
MppBuffer mpp_buffer = mpp_frame_get_buffer(frame); // 仅传入 frame 参数
if (mpp_buffer == NULL) {
printf("Failed to get buffer from MppFrame\n");
mpp_packet_deinit(&packet);
free(h264_data);
mpp_destroy(mpp_ctx);
return -1;
}
// 获取 YUV 数据
void *yuv_data = mpp_buffer_get_ptr(mpp_buffer); // 获取 YUV 数据的指针
size_t yuv_size = mpp_buffer_get_size(mpp_buffer); // 获取 YUV 数据的大小
printf("Decoded frame size: %zu bytes\n", yuv_size);
// 释放资源
mpp_packet_deinit(&packet);
free(h264_data);
mpp_destroy(mpp_ctx);
return 0;
}