OpenHarmony视频编解码入坑记录

OpenHarmony视频编解码入坑记录

之前搞的OpenHarmony的camera和GPU相关的东西还没摸清楚、搞出来,ARK和浏览器更是遥遥无期。。又要进入一个新的未知领域去遨游了(不是)。
调研性资料,所以东西比较杂。有些东西写出来可能没啥用。


前言

没有经验没人带,计划刚开始以偏概全,从网上扒拉资料,结合4.0版本的rk3568和荔枝派产品入手。
开发文档与实际实现方案可能会有出入。

一、入坑前思考

1、据我了解,音频是走了codeC的,视频大概率也会走该流程。
2、需要确定OH 的视频播放是否走硬编解码还是单纯的软编解码。走软编解码的话,CPU是否扛得住,大概率会出现卡顿。
3、录制过程中为编码过程,播放过程中为解码过程。录制的换肯定还得先把camera调通,能拍照后再继续定位录制的问题。
4、3.2release的RISCV64架构荔枝派版本是不能进行视频录制和播放的,所以不能用来参考。据了解OHOS4.0release的dayu200开发板上跑rk3568版本,是可以正常进行视频录制和播放的可以去参考。先整个版本跑起来测试一下,这样能根据hilog的打印进一步确认HDI流程。
5、需要了解常用的编码格式,并确认OHOS是使用的那种方案。
YUV、NV12、NV21、H264。。。
6、确认视频录像与播放所需要的权限,参考rk3568即可。
7、了解gstreamer。
8、虽然还没有确认3.2beta1与4.0release的差别有多少,但根据调是camera的经历,区别肯定很大,尤其是HDF那块。

二、走马观花

先上个网上扒来的图,下面三张图非原创,全部来自于
https://bbs.elecfans.com/jishu_2291104_1_1.html
永不辅助了解运行机制和流程。
在这里插入图片描述
应用层–视频----》接口层–VideoRecorder、VideoPlayer----》框架层–RecorderService、PlayerService、RecorderEngineInterface、PlayerEngineInterface、RecorderEngineGstImplementation、PlayerEngineGstImplementation以及音频的同一套东西、VideoHDIencoder、VideoHDIdecoder、等----》硬件接口层–codec HDI。
在这里插入图片描述

如图所示,播放一个视频大致分为 4 步: 解协议->解封装->解压缩->送显 播放pipeline 根据视频播放的步骤,我们在
OpenHarmony 上每一个环节都能找到对应的插件来完成,同时参考 media_standard
代码仓的代码目录,相关的代码都可以找到对应的实现逻辑。

在这里插入图片描述

1、对于一个本地视频文件(比如/data/h264-640x480.mp4),对应的 filesrc 插件来完成文件的解析,拿到MP4文件流; 这样就会得到一个 URI:file:///data/h264-640x480.mp4,gst 正是通过 URI 前缀来判断是否是本地视频文件,然后获取文件内容。

2、拿到 MP4 文件流后,对应的 qtdemux 插件来解封装,完成音视频分流,输出 H264 裸码流和音频流;

3、拿到 H264 码流后,h264parse 插件开始切片,输出 H264 帧数据;

4、处理 H264 帧数据,就由 avdec_h264 插件来完成,一般情况会输出 NV12 的像素数据,当然这个解码器是基于 ffmpeg的软解插件,相信不久各个芯片厂商的硬件加速解码器都会加进来;可以使用 gst-inspect 工具查看 avdec_h264 解码插件,使用 ffmpeg 的解码能力,支持的格式非常丰富。
5、至此解码的工作已经完成,后面就要根据显示的像素格式、size 来对解码输出数据进行后处理(转换、缩放、裁剪等),会由 Converter、Scaler、Clip 插件来完成;
6、满足显示要求后就会使用 surfacesink 插件完成合成送显,送显需要先申请显示 surface buffer,申请好的 buffer 会放入 buffer pool,形成一个 buffer 队列。解码器解完一帧会将数据放入 buffer pool,sink 插件会从 buffer pool 中拿到数据送显。再加上 audio 的插件解码出音频数据,OpenHarmony 的 player 会完成音视频同步,至此一个视频文件就会播放显示在屏幕上。

OpenHarmony 为了实现更好的用户体验,同时也引入了一些解决性能问题的插件,比如 multiqueue 插件来实现 buffer 队列,也使用 decodebin 高级插件来完成解码 element 的选择。
在这里插入图片描述
而通过播放 OpenHarmony 自带的图库播放本地 H264 视频,抓取 log,搜索 OnElementSetupCb 关键字也可以得到播放的 pipeline,这也进一步验证了本文的分析。

三、以偏概全(个人猜测)

1.device

device/board/sipeed/lpi4a目录下没有视频相关内容,但/device/soc/sipeed/lpi4a/hardware和device/board/sipeed/lpi4a都有codec的东西,暂时还不确定这个codec是只用于音频的还是音视频都有。
感觉视频显示应该要用到display相关的东西device\soc\sipeed\lpi4a\hardware\display。
确认需要适配的内如目录如下:
device\soc\sipeed\lpi4a\hardware\omx_il\

2.foundation

foundation\multimedia\player_framework这个估计是播放器的东西,音视频的都有。

3.vendor

应该跟camera类似,大多是相关的驱动配置。

4.driver

驱动的hdf_core肯定要走,drivers\interface\display,drivers\peripheral\codec,drivers\peripheral\display应该也要走到。
确认了服务的名称为“codec_hdi_omx_service”,结合之前调试camera发日志,确认HDF服务链表里是有这个服务的,捕获遇到调试camera时遇到的获取不到服务的问题。

5.third_party

ffmpeg、openmax、openh264

6.kernel

建议先找一下相关demo跑一下,确认底层内核正常。

四、印证猜测

开始结合运行日志梳理视频录制与播放即编码与解码的流程。
在这里插入图片描述
如果上图仍适用于当前版本的话,那视频的编解码基本就走了multimedia_player_framework、drivers_peripheral_codec、third_party_openmax外加vendor下产品配置相关的几个仓。

尝试

日志分析

尝试从分析rk3568的日志入手
视频播放流程走了ace_engine,目前还没确认riscv的这块内容有没有问题,如果流程跟音频播放一样的话就可以正常往下走。
hungtask_user process 563 is kicked
播放按钮按下产生打印

涉及进程
ACE–处理点击事件–trigger modify media player

Photos–VideoBrowser–Bufferqueue–trigger modify media player–申请内存
MediaServerManager
{WriteInfo():80} ------------------RecorderServer------------------
{WriteInfo():80} ------------------CodecServer------------------
{WriteInfo():80} ------------------AVMetaServer------------- -----
IPCObjectStub
播放器相关
PlayerListenerStub
PlayerServiceProxy
PlayerServiceStub
PlayerServer
PlayerSinkProvider
PlayBinCtrlerBase
AudioFramework
GstMsgConvDefault—audioserversink4 change state from PAUSED to PLAYING
MediaServiceStub
HdiVdecOutBufferMgr
codec_hdi_server

日志中并没有多少涉及HDI的打印信息。也没有发现解码的痕迹。

播放MP4

计划通过HDC将一个MP4视频拷到设备上播放一下看看情况。由于实验室网络改造,导致有线和无线设备在不同网段。。HDC无法使用
尝试mount镜像文件,报错。。
修改网络配置,连接其他wifi,问题解决。
lpi4a版本没有图片视频浏览工具,目前无法进行视频播放。

查看修改记录

准备查看一下官方gitee上4.0release分支关于编解码的合入记录,追踪流程。
查看https://gitee.com/openharmony/drivers_peripheral/commit/72a84240046a5fcf6beac3758877ed48b08eada3
等codec相关合入记录,4.0版本应该没有适配riscv。

了解demo并尝试运行

计划了解/home/ptg/release_4.0_video/drivers/peripheral/codec/test/中的测试demo并尝试运行。

参考资料

https://blog.youkuaiyun.com/yohnyang/article/details/129278446
https://blog.youkuaiyun.com/qq_20986663/article/details/132995675
https://isrc.iscas.ac.cn/gitlab/riscv/polyosmobile/ohos_qemu/multimedia_av_codec/-/blob/OpenHarmony-4.0-Release/README_zh.md?ref_type=heads
https://laval.youkuaiyun.com/648055179787b754b2643f15.html
https://ost.51cto.com/posts/10829
https://bbs.elecfans.com/jishu_2291104_1_1.html
https://blog.51cto.com/u_16099361/9575025
https://laval.youkuaiyun.com/64c8b15874de4411227abcab.html
https://laval.youkuaiyun.com/648055179787b754b2643f15.html

openmax
https://blog.youkuaiyun.com/weixin_54353432/article/details/130442673
https://blog.youkuaiyun.com/wangbuji/article/details/124830923
gst介绍
https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-language=c
https://blog.youkuaiyun.com/qq_45662588/article/details/120763198

OpenHarmony 3.2 Beta1 版本路书
https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md

OpenHarmony媒体子系统框架介绍
https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E5%AA%92%E4%BD%93%E5%AD%90%E7%B3%BB%E7%BB%9F.md

OpenHarmony视频播放应用开发指导
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/video-playback.md

总结

门外汉估计要花个挺久的时间去熟悉相关概念,然后再是架构。接下来进行适配,测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值