基于rk3399 (Linux)的多视频窗口播放器
Posted faststream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于rk3399 (Linux)的多视频窗口播放器相关的知识,希望对你有一定的参考价值。
基于rk3399 (Linux)的多视频窗口播放器
问题背景,海思芯片被制裁,用作监控安防的芯片市场价不短攀升,甚至出现花钱无法采购到的窘境,比如之前hisi3531、3559 、3536等等芯片。我们发现了另外一款性价比比较高的国产芯片——rk3399,只是他不想海思芯片那样拥有完整的生态,提供用户各种需要的api,让用户很容易实现解码播放、多窗口的叠加,移动,缩放等效果。怎么办呢?我们基于rk3399完成了一套完整的项目解码播放方案,完全可以做到多窗口叠加,移动,缩放效果。
- 解码。
- 硬件解码。
解码rk提供的有rk-mpi可以实现硬件的解码。官方也提供了demo,Mpp的API思路其实跟目前绝大多数的编解码库是一致的,都是queue/dequeue的队列操作方式,先设置好编解码状态,然后不停的queue/dequeue input/output buffer就可以实现编解码控制了。如果大家熟悉FFMPEG,那学习MPP会非常容易,MPP和FFMPEG的api非常相像。
解码后得道MppFrame.
width = mpp_frame_get_width(frame);
height = mpp_frame_get_height(frame);
h_stride = mpp_frame_get_hor_stride(frame);
v_stride = mpp_frame_get_ver_stride(frame);
//fmt = mpp_frame_get_fmt(frame);
buffer = mpp_frame_get_buffer(frame);
dmaFd = mpp_buffer_get_fd(buffer);
//printf("dmaFd %x\\n",dmaFd);
//base = (RK_U8 *)mpp_buffer_get_ptr(buffer);
int stride = mpp_frame_get_hor_stride(frame);
这里有一句关键的dmaFd = mpp_buffer_get_fd(frame);获取一个dmaFd,是一个int类型。表示一块缓存id.
这个id就是dma buffer。解码器,显示单元都能直接访问缓存内容。
- 渲染。
1,drm渲染。
DRM是Linux目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬件。比如FB原生不支持多层合成,不支持VSYNC,不支持DMA-BUF,不支持异步更新,不支持fence机制等等,而这些功能DRM原生都支持。同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护
我们可以通过用libdrm 把dma buf 直接输出到显示器。
但是这种办法无法无法对图像缩放。于是,我想到利用opengl缩放。面临第一个问题是怎么把dmaFd 转成opengl的纹理?
2,openggl渲染。
如图,利用egl的eglCreateImageKHR把解码图像dmafd转成纹理,通过opengl缩放后脚给egl,egl 通过gbm接口跟drm交互,实现图像的显示。
qq交流群:643201623
RK3588平台开发系列讲解(AUDIO篇)基于alsa api的音频播放/录制流程
平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3588 |
Linux 5.10 |
Android 12 |
文章目录
沉淀、分享、成长,让自己和他人都能有所收获!
以上是关于基于rk3399 (Linux)的多视频窗口播放器的主要内容,如果未能解决你的问题,请参考以下文章
RK3399驱动开发 | 08 - RK3399显示系统详解(基于RK SDK Linux 4.4.194内核)
RK3399平台开发系列讲解(基础篇)Linux延迟工作机制 - 视频课