当前位置: 首页 > news >正文

万江网站制作PHP网站开发都需要学什么

万江网站制作,PHP网站开发都需要学什么,企业邮箱登录入口263,可以做两个网站指向同一个域名在HarmonyOS下自渲染视频数据 在本文中#xff0c;我们将介绍如何在HarmonyOS下自渲染视频数据。我们将实现包括创建本地窗口、设置缓冲区选项、请求缓冲区、处理视频帧数据以及刷新缓冲区等步骤。 环境准备 在开始之前#xff0c;请确保您已经安装了HarmonyOS的开发环境我们将介绍如何在HarmonyOS下自渲染视频数据。我们将实现包括创建本地窗口、设置缓冲区选项、请求缓冲区、处理视频帧数据以及刷新缓冲区等步骤。 环境准备 在开始之前请确保您已经安装了HarmonyOS的开发环境并且能够编译和运行C代码。 注意⚠️ 以下方案中用到的API都不是线程安全的我这里是通过其他手段有保护的请自行上锁 创建本地窗口 首先我们需要根据surfaceId创建一个本地窗口。如何拿这个surfaceId有两种方案: 一种是原生ArkTs UI开发从XComponent拿;一种是跨平台框架比如 flutter通过TextureRegistry注册一个Texture拿, NativeWindowRender 类的构造函数中实现了这一功能 NativeWindowRender::NativeWindowRender(const RenderConfig config) : render_config_(config) {int ret OH_NativeWindow_CreateNativeWindowFromSurfaceId(config.surfaceId, window_);if (window_ nullptr || ret ! 0) {LOG_ERROR(create native window failed: {}, ret);return;} }在这里我们使用 OH_NativeWindow_CreateNativeWindowFromSurfaceId 函数从surfaceId创建一个本地窗口。如果创建失败会记录错误日志。 设置缓冲区选项 创建本地窗口后我们需要设置一些缓冲区选项例如缓冲区使用情况、交换间隔、请求超时、颜色范围和变换等可以参考 NativeWindowOperation我暂时只设置了这些看看渲染效果和性能 bool NativeWindowRender::UpdateNativeBufferOptionsByVideoFrame(const VideoFrame *frame) { #if 0// get current buffer geometry, if different, reset buffer geometryint32_t stride 0;int32_t height 0;// the fucking order of get is h, w, however, the fucking order of set is w, hint ret OH_NativeWindow_NativeWindowHandleOpt(window_, GET_BUFFER_GEOMETRY, height, stride);if (ret ! 0) {LOG_ERROR(get buffer geometry failed: {}, ret);return false;}// set buffer geometry if differentif (stride ! frame-yStride || height ! frame-height) {ret OH_NativeWindow_NativeWindowHandleOpt(window_, SET_BUFFER_GEOMETRY, frame-yStride, frame-height);if (ret ! 0) {LOG_ERROR(set buffer geometry failed: {}, ret);return false;}} #elseint ret OH_NativeWindow_NativeWindowHandleOpt(window_, SET_BUFFER_GEOMETRY, frame-yStride, frame-height);if (ret ! 0) {LOG_ERROR(set buffer geometry failed: {}, ret);return false;} #endif// set buffer formatret OH_NativeWindow_NativeWindowHandleOpt(window_, SET_FORMAT, NATIVEBUFFER_PIXEL_FMT_YCBCR_420_P);if (ret ! 0) {LOG_ERROR(set buffer format failed: {}, ret);return false;}// set buffer strideret OH_NativeWindow_NativeWindowHandleOpt(window_, SET_STRIDE, 4);if (ret ! 0) {LOG_ERROR(set buffer stride failed: {}, ret);return false;}// set native source type to OH_SURFACE_SOURCE_VIDEOret OH_NativeWindow_NativeWindowHandleOpt(window_, SET_SOURCE_TYPE, OH_SURFACE_SOURCE_VIDEO);if (ret ! 0) {LOG_ERROR(set source type failed: {}, ret);return false;}// set app framework typeret OH_NativeWindow_NativeWindowHandleOpt(window_, SET_APP_FRAMEWORK_TYPE, unknown);if (ret ! 0) {LOG_ERROR(set app framework type failed: {}, ret);return false;}return true; }请求缓冲区并处理视频帧数据 在接收到视频帧数据时我们需要请求缓冲区并将视频帧数据写入缓冲区, 坑点来了UpdateNativeBufferOptionsByVideoFrame 你必须每次request前都要调用。。。。我反正没找到文档哪里有写又或者我理解能力有问题坑了一两个小时最后lldb debug发现如果只在构造函数中设置的话只有第一次request出来的BufferHandle中的width height stride format等参数是符合预期的后面就不对了结果就只能画出来第一张图后面没有任何报错但是就是不出图所以切记切记 每次都要调用 (吗请帮忙指正) void NativeWindowRender::OnVideoFrameReceived(const void *videoFrame, const VideoFrameConfig config, bool resize) {const VideoFrame *frame reinterpret_castconst VideoFrame *(videoFrame);// must call this every time, coz every time you request a buffer, the properties of BufferHandle may change to// default value.if (!UpdateNativeBufferOptionsByVideoFrame(frame)) {return;}// request buffer from native windowOHNativeWindowBuffer *buffer nullptr;int fence_fd -1;int ret OH_NativeWindow_NativeWindowRequestBuffer(window_, buffer, fence_fd);if (ret ! 0 || buffer nullptr) {LOG_ERROR(request buffer failed: {}, ret);return;}// get buffer handle from native bufferBufferHandle *handle OH_NativeWindow_GetBufferHandleFromNative(buffer);// mmap buffer handle to write datavoid *data mmap(handle-virAddr, handle-size, PROT_READ | PROT_WRITE, MAP_SHARED, handle-fd, 0);if (data MAP_FAILED) {LOG_ERROR(mmap buffer failed);return;}// wait for fence fd to be signaleduint32_t timeout 3000;if (fence_fd ! -1) {struct pollfd fds {.fd fence_fd, .events POLLIN};do {ret poll(fds, 1, timeout);} while (ret -1 (errno EINTR || errno EAGAIN));close(fence_fd);}// copy yuv420 data to bufferuint8_t *y (uint8_t *)data;uint8_t *u y frame-yStride * frame-height;uint8_t *v u frame-uStride * frame-height / 2;memcpy(y, frame-yBuffer, frame-yStride * frame-height);memcpy(u, frame-uBuffer, frame-uStride * frame-height / 2);memcpy(v, frame-vBuffer, frame-vStride * frame-height / 2);// flush bufferRegion region{.rects nullptr, .rectNumber 0};int acquire_fence_fd -1;ret OH_NativeWindow_NativeWindowFlushBuffer(window_, buffer, acquire_fence_fd, region);if (ret ! 0) {LOG_ERROR(flush buffer failed: {}, ret);}// unmap buffer handleret munmap(data, handle-size);if (ret ! 0) {LOG_ERROR(munmap buffer failed: {}, ret);} }在这里我们首先调用 UpdateNativeBufferOptionsByVideoFrame 函数更新缓冲区选项然后请求缓冲区并将视频帧数据写入缓冲区。最后我们刷新缓冲区并解除映射。 结论 通过以上步骤我们可以在HarmonyOS下实现自渲染视频数据。希望本文对您有所帮助。如果您有任何问题或建议请随时与我联系。 PS 另外一种方案是拿到NativeWindow后用opengl自己画但是opengl这个鬼你也知道的一个context要一个线程我要是十几路几十路视频渲染就得几十个线程这在移动平台谁能忍共享context的话我自信我这种new opengler不能保证不出错。。。可以参考官方文档 自定义渲染 (XComponent) 。所以这种方案交给鸿蒙UI框架说着说系统自己画的叫懒人方案
http://www.pierceye.com/news/712683/

相关文章:

  • 网站系统开发毕业设计哈尔滨seo优化软件
  • 南通企业网站网站制作的书籍
  • 长沙网站收录怎么网站能找人做装修事
  • 鞍山网站制作谁家好2021没封的网站有人分享吗
  • 网站建设公司net2006iis虚拟网站
  • 有哪些竞价网站wordpress手机端网站模板下载
  • 浙江建设厅网站施工员报名莱芜庞允盟
  • 网站建设 销售 知乎云南网站设计外包
  • 网站建设怎么学习phpcms门户网站
  • 佛山营销型网站定制三站合一网站建设方案
  • 广州市哪有做网站的查找全国免费网站建设
  • 江门seo网站推广跳动爱心代码html教程
  • 网站退出率网易搜索引擎入口
  • 企业网站建设方讯长沙城乡建设网站
  • 手机网站建设优化软件做网站空间费用是什么意思
  • 网站透明效果工厂网站建设流程图
  • 崇安网站建设广州本地门户网站
  • 网站建设公司河南郑州wordpress 单栏
  • 盐城市城镇化建设投资集团网站深圳专业企业网站制作哪家好
  • 绵阳做网站哪家公司好青岛手工活外发加工网
  • 如何调用网站列表页河北建基官网
  • 灰系网站wordpress 谷歌收录
  • 怎么把网站关掉wordpress小白
  • 开发网站合作协议网站建设团购
  • 管理手机网站网站规划与建设重要性理解与体会
  • 小辰青岛网站建设自己怎么开网站
  • 天津市建设工程合同备案网站网站建设 开发 模板
  • 外贸网站建设公司报价jsp网站建设技术案例
  • 旅行社英文模板网站织梦 网站迁移
  • 北京网站开发不限年龄伊春建设银行网站