1292
- 收藏
- 点赞
- 分享
- 举报
RV1126 ffmpeg rkmedia vdec 播放器,播放本地mp4问题
悬赏金¥ 10
已结题
流程如下:
1.解码器初始化
VDEC_CHN_ATTR_S stVdecAttr;
stVdecAttr.enCodecType = RK_CODEC_TYPE_H264;
stVdecAttr.enMode = VIDEO_MODE_FRAME;
stVdecAttr.enDecodecMode = VIDEO_DECODEC_HADRWARE;
ret = RK_MPI_VDEC_CreateChn(0, &stVdecAttr);
2.ffmpeg读取AVPacket
AVPacket XFFmpeg::Read()
{
AVPacket pkt;
memset(&pkt, 0, sizeof(AVPacket));
mutex.lock();
if (!ic)
{
mutex.unlock();
return pkt;
}
int err = av_read_frame(ic, &pkt);
if (err != 0)
{
av_strerror(err, errorbuf, sizeof(errorbuf));
}
mutex.unlock();
return pkt;
}
3.周期性将AVPacket的数据发送给解码器
connect(&m_tmrVideoUpdate, &QTimer::timeout, this, [this]()
{
if(XFFmpeg::Get()->isPlay)
{
AVPacket pkt = XFFmpeg::Get()->Read();
if (pkt.size > 0)
{
if (pkt.stream_index == XFFmpeg::Get()->audioStream)
{
qDebug() << "定时器刷新音频";
// CRkProcessWidget::Get()->cAudioDecode(reinterpret_cast<char*>(pkt.data), pkt.size);
int tmp_apts = XFFmpeg::Get()->GetPts(&pkt); // 更新音频的 pts
if(tmp_apts % 1000 == 0)
{
emit CRkProcessWidget::Get()->signalPtsUpdate(tmp_apts);
}
}
if (pkt.stream_index == XFFmpeg::Get()->videoStream)
{
qDebug() << "定时器刷新视频";
qDebug() << "视频数据:"<<pkt.size;
CRkProcessWidget::Get()->cVideoDecode(reinterpret_cast<char*>(pkt.buf->buffer), pkt.buf->size);
// CMppH264Decoder::Get()->cDecode(&pkt);
}
}
av_packet_unref(&pkt);
}
m_tmrVideoUpdate.start(30);
});
int CRkProcessWidget::cVideoDecode(char* data, int size)
{
// saveDataToFile(data, size, "/userdata/packet.bin");
m_mutex.lock();
qDebug()<<"进入Rk视频解码"<<endl;
// 创建媒体缓冲区
MEDIA_BUFFER mb = RK_MPI_MB_CreateBuffer((RK_U32)size, RK_FALSE, 0);
// 检查缓冲区创建是否成功
if (mb == nullptr)
{
qDebug() << "Error: Failed to create media buffer";
return -1;
}
// 将数据复制到媒体缓冲区
memcpy(RK_MPI_MB_GetPtr(mb), data, (size_t)size);
qDebug() << " buffer size"<<RK_MPI_MB_GetSize(mb);
RK_MPI_MB_SetSize(mb, (size_t)size);
// printf("#Send packet(%p, %zuBytes) to VDEC[0].\n", RK_MPI_MB_GetPtr(mb),
// RK_MPI_MB_GetSize(mb));
// saveDataToFile(reinterpret_cast<char*>(RK_MPI_MB_GetPtr(mb)), static_cast<size_t>(RK_MPI_MB_GetSize(mb)), "/userdata/mb.bin");
// 发送媒体缓冲区到解码通道
int ret = RK_MPI_SYS_SendMediaBuffer(RK_ID_VDEC, 0, mb);
qDebug()<<"发送视频解码"<<endl;
if (ret != 0)
{
qDebug() << "Error: Failed to send media buffer, ret=" << ret;
RK_MPI_MB_ReleaseBuffer(mb);
return -1;
}
RK_MPI_MB_ReleaseBuffer(mb);
m_mutex.unlock();
CRkProcessWidget::Get()->cGetImage();
return 0;
}
int CRkProcessWidget::cVideoDecode(char* data, int size)
{
// saveDataToFile(data, size, "/userdata/packet.bin");
m_mutex.lock();
qDebug()<<"进入Rk视频解码"<<endl;
// 创建媒体缓冲区
MEDIA_BUFFER mb = RK_MPI_MB_CreateBuffer((RK_U32)size, RK_FALSE, 0);
// 检查缓冲区创建是否成功
if (mb == nullptr)
{
qDebug() << "Error: Failed to create media buffer";
return -1;
}
// 将数据复制到媒体缓冲区
memcpy(RK_MPI_MB_GetPtr(mb), data, (size_t)size);
qDebug() << " buffer size"<<RK_MPI_MB_GetSize(mb);
RK_MPI_MB_SetSize(mb, (size_t)size);
// printf("#Send packet(%p, %zuBytes) to VDEC[0].\n", RK_MPI_MB_GetPtr(mb),
// RK_MPI_MB_GetSize(mb));
// saveDataToFile(reinterpret_cast<char*>(RK_MPI_MB_GetPtr(mb)), static_cast<size_t>(RK_MPI_MB_GetSize(mb)), "/userdata/mb.bin");
// 发送媒体缓冲区到解码通道
int ret = RK_MPI_SYS_SendMediaBuffer(RK_ID_VDEC, 0, mb);
qDebug()<<"发送视频解码"<<endl;
if (ret != 0)
{
qDebug() << "Error: Failed to send media buffer, ret=" << ret;
RK_MPI_MB_ReleaseBuffer(mb);
return -1;
}
RK_MPI_MB_ReleaseBuffer(mb);
m_mutex.unlock();
CRkProcessWidget::Get()->cGetImage();
return 0;
}
4.获取解码后的数据并转换为qimage
int CRkProcessWidget::cGetImage()
{
MEDIA_BUFFER mb = nullptr;
int ret = 0;
mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VDEC, 0, 1000);
if (!mb)
{
qDebug()<<"RK_MPI_SYS_GetMediaBuffer get null buffer in 5s.."<<endl;
// QThread::msleep(20);
return -1;
}
// while(1)
// {
// mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VDEC, 0, 1000);
// if (!mb)
// {
// qDebug()<<"RK_MPI_SYS_GetMediaBuffer get null buffer in 5s.."<<endl;
// QThread::msleep(20);
// continue;
// }
// else
// {
// qDebug()<<"get buffer"<<endl;
// break;
// }
// }
MB_IMAGE_INFO_S stImageInfo = {0};
ret = RK_MPI_MB_GetImageInfo(mb, &stImageInfo);
if (ret) {
printf("Get image info failed! ret = %d\n", ret);
RK_MPI_MB_ReleaseBuffer(mb);
return -1;
}
// 打印图像信息
printf("Image Info:\n");
printf("Width: %u\n", stImageInfo.u32Width);
printf("Height: %u\n", stImageInfo.u32Height);
printf("Horizontal Stride: %u\n", stImageInfo.u32HorStride);
printf("Image Type: %u\n", stImageInfo.enImgType);
printf("#Send packet(%p, %zuBytes) to VDEC[0].\n", RK_MPI_MB_GetPtr(mb),
RK_MPI_MB_GetSize(mb));
const int imageSize = VIDEO_WIDTH * VIDEO_HEIGHT; // RGB888 格式
// 获取 MEDIA_BUFFER 中的数据指针和大小
void *dataPtr = RK_MPI_MB_GetPtr(mb);
size_t dataSize = RK_MPI_MB_GetSize(mb);
// 检查数据大小是否符合预期
if (dataSize != imageSize)
{
qDebug() << "Error: Data size mismatch";
RK_MPI_MB_ReleaseBuffer(mb); // 释放 MEDIA_BUFFER
return -1;
}
QImage image((uchar*)dataPtr, VIDEO_WIDTH, VIDEO_HEIGHT, QImage::Format_RGB888);
if (image.isNull()) {
qDebug() << "Error: Failed to create QImage";
RK_MPI_MB_ReleaseBuffer(mb); // 释放 MEDIA_BUFFER
return -1;
}
qDebug()<<"发送显示图像"<<endl;
emit CRkProcessWidget::Get()->signalImageUpdate(image);
RK_MPI_MB_ReleaseBuffer(mb);
return 0;
}
问题在于 int CRkProcessWidget::cGetImage() 中的mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VDEC, 0, 1000);一直无法接收到解码后得到数据,一直显示超时
[RKMEDIA][SYS][Info]:INFO: RkmediaChnPopBuffer: Mode[VDEC]:Chn[0] get mediabuffer timeout!
我来回答
回答1个
时间排序
认可量排序
认可1
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2021-06-18 20:03:56
-
2013-11-20 20:17:23
-
2020-12-24 09:24:41
-
2019-10-12 16:24:24
-
2017-03-02 17:04:51
-
2016-07-08 14:26:05
-
2013-08-27 21:58:21
-
2017-05-01 12:24:48
-
2019-11-09 18:19:27
-
2020-03-24 15:30:19
-
2019-12-21 11:22:39
-
2017-05-01 13:07:33
-
2015-10-18 16:55:24
-
2020-11-17 13:59:41
-
2015-11-26 14:19:31
-
2019-11-09 19:27:01
-
2016-12-26 21:18:32
-
2021-01-19 16:35:59
-
22015-09-26 15:06:41
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
最佳回答
被评为最佳回答,即可获得10元悬赏金额,先回答帮助题主解决问题,会更具优势
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认