首页 文章 精选 留言 我的

精选列表

搜索[python解释器],共10000篇文章
优秀的个人博客,低调大师

GKTemplate v0.0.4,采用 Go 开发的 DedeCMS 模板解析器

是否还记得,在PHP流行的年代,有一款开源免费的网站内容管理系统DedeCMS风靡全国。买域名,买空间主机,下载程序安装,设置好栏目,换上模板,添加采集规则,诺大一个门户瞬间就搭建好了。 SEO成就了DedeCMS的疯狂,但也是因为这样的疯狂让DedeCMS错过了移动互联网。全新的互联网时代,前后端分离,让模版解析渲染变得不再那么重要。 作为DedeCMS的核心开发者之一,也从PHP转到了Go,为了致敬DedeCMS,决定采用Go开发了一个类DedeCMS模板解析引擎的库。扩展库将骄傲地采用中国首个开源协议“木兰宽松许可证”进行发布。 背景 GKTemplate是一个Go语言开发的模板引擎,由于Go语言内置的模板引擎自由度过高,导致开发使用相对比较困难,对界面模板制作要求会比较高,GKTemplate是一款基于标签、属性机制的模板引擎,在牺牲部分自由度、性能的前提下,优化模板语义机制,使得开发、制作模板变得更为轻松简单。 特点 UTF-8编码支持:模板引擎要求采用UTF-8编码,便于界面能够国际化支持; 简单明了属性标记:类似XML结构的属性标记,上手简单,制作模板轻松自如; 错误定位:模板标签错误定位,方便模板制作开发调试; 标签化语义:类似XHTML标签语义,降低模板制作难度,减少开发制作成本; 自由扩展:留有丰富的标签开发接口,方便进行二次扩展; 缓存机制:模板解析进行缓存,模板解析性能达到最高; 协程并发:采用Go协程机制,标签解析可并发操作,模板渲染性能最高; 最小依赖:模板引擎只依赖Go默认库,不依赖任何第三方库; 用途 GKTemplate主要用于采用Go编写的HTTP Server中需要自定义呈现数据结构页面,同时也适用于采用模板机制生成例如:静态文件、静态文本等。 性能 该模板引擎性能稳定,符合开发者及用户使用要求,详细可参考模板引擎benchmark测试样例。 使用方法 执行go get -u -v github.com/gokeeptech/gktemplate 使用方法可以参考examples目录中的例子。

优秀的个人博客,低调大师

Android播放器实现视频窗口实时放大缩小功能

很多开发者希望我们的Android平台RTSP/RTMP播放端实现视频窗口的放大缩小功能,为此,我们做了个简单的demo,通过播放端回调RGB数据,直接在上层view操作处理即可,Github:https://github.com/daniulive/SmarterStreaming 无视频无真相:http://www.iqiyi.com/w_19s9sa7epp.html 基本流程如下: 基础的初始化和参数设定 libPlayer = new SmartPlayerJniV2(); myContext = this.getApplicationContext(); sSurfaceView = (SurfaceView) this.findViewById(R.id.surface); surface_renderer = new RGBSurfaceRenderer(sSurfaceView); private void InitAndSetConfig() { playerHandle = libPlayer.SmartPlayerOpen(myContext); if (playerHandle == 0) { Log.e(TAG, "surfaceHandle with nil.."); return; } libPlayer.SetSmartPlayerEventCallbackV2(playerHandle, new EventHandeV2()); libPlayer.SmartPlayerSetBuffer(playerHandle, playBuffer); // set report download speed(默认2秒一次回调 用户可自行调整report间隔) libPlayer.SmartPlayerSetReportDownloadSpeed(playerHandle, 1, 2); libPlayer.SmartPlayerSetFastStartup(playerHandle, isFastStartup ? 1 : 0); //设置RTSP超时时间 int rtsp_timeout = 10; libPlayer.SmartPlayerSetRTSPTimeout(playerHandle, rtsp_timeout); //设置RTSP TCP/UDP模式自动切换 int is_auto_switch_tcp_udp = 1; libPlayer.SmartPlayerSetRTSPAutoSwitchTcpUdp(playerHandle, is_auto_switch_tcp_udp); libPlayer.SmartPlayerSaveImageFlag(playerHandle, 1); // It only used when playback RTSP stream.. // libPlayer.SmartPlayerSetRTSPTcpMode(playerHandle, 1); playbackUrl = "rtmp://202.69.69.180:443/webcast/bshdlive-pc"; //playbackUrl = "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov"; libPlayer.SmartPlayerSetUrl(playerHandle, playbackUrl); } 2. 设置External Render,回调RGBA数据 libPlayer.SmartPlayerSetExternalRender(playerHandle, new RGBAExternalRender()); Log.i(TAG, "Start playback stream++"); InitAndSetConfig(); // External Render libPlayer.SmartPlayerSetExternalRender(playerHandle, new RGBAExternalRender()); libPlayer.SmartPlayerSetAudioOutputType(playerHandle, 0); if (isMute) { libPlayer.SmartPlayerSetMute(playerHandle, isMute ? 1 : 0); } if (isHardwareDecoder) { int isSupportHevcHwDecoder = libPlayer.SetSmartPlayerVideoHevcHWDecoder(playerHandle, 1); int isSupportH264HwDecoder = libPlayer .SetSmartPlayerVideoHWDecoder(playerHandle, 1); Log.i(TAG, "isSupportH264HwDecoder: " + isSupportH264HwDecoder + ", isSupportHevcHwDecoder: " + isSupportHevcHwDecoder); } libPlayer.SmartPlayerSetLowLatencyMode(playerHandle, isLowLatency ? 1 : 0); libPlayer.SmartPlayerSetFlipVertical(playerHandle, is_flip_vertical ? 1 : 0); libPlayer.SmartPlayerSetFlipHorizontal(playerHandle, is_flip_horizontal ? 1 : 0); libPlayer.SmartPlayerSetRotation(playerHandle, rotate_degrees); int iPlaybackRet = libPlayer .SmartPlayerStartPlay(playerHandle); if (iPlaybackRet != 0) { Log.e(TAG, "Call SmartPlayerStartPlay failed.."); return; } surface_renderer.StartRender(); btnStartStopPlayback.setText("停止播放 "); isPlaying = true; Log.i(TAG, "Start playback stream--"); 回调RGBA数据: class RGBAExternalRender implements NTExternalRender { // public static final int NT_FRAME_FORMAT_RGBA = 1; // public static final int NT_FRAME_FORMAT_ABGR = 2; // public static final int NT_FRAME_FORMAT_I420 = 3; private int width_ = 0; private int height_ = 0; private int row_bytes_ = 0; private ByteBuffer rgba_buffer_ = null; @Override public int getNTFrameFormat() { Log.i(TAG, "RGBAExternalRender::getNTFrameFormat return " + NT_FRAME_FORMAT_RGBA); return NT_FRAME_FORMAT_RGBA; } @Override public void onNTFrameSizeChanged(int width, int height) { width_ = width; height_ = height; row_bytes_ = width_ * 4; Log.i(TAG, "RGBAExternalRender::onNTFrameSizeChanged width_:" + width_ + " height_:" + height_); rgba_buffer_ = ByteBuffer.allocateDirect(row_bytes_ * height_); } @Override public ByteBuffer getNTPlaneByteBuffer(int index) { if (index == 0) { return rgba_buffer_; } else { Log.e(TAG, "RGBAExternalRender::getNTPlaneByteBuffer index error:" + index); return null; } } @Override public int getNTPlanePerRowBytes(int index) { if (index == 0) { return row_bytes_; } else { Log.e(TAG, "RGBAExternalRender::getNTPlanePerRowBytes index error:" + index); return 0; } } public void onNTRenderFrame(int width, int height, long timestamp) { if (rgba_buffer_ == null) return; // rgba_buffer_.rewind(); // copy buffer // test // byte[] test_buffer = new byte[16]; // rgba_buffer_.get(test_buffer); //Log.i(TAG, "RGBAExternalRender:onNTRenderFrame w=" + width + " h=" // + height + " timestamp=" + timestamp); // Log.i(TAG, "RGBAExternalRender:onNTRenderFrame rgba:" + // bytesToHexString(test_buffer)); if ( surface_renderer != null) { surface_renderer.SetRGBImage(width, height, rgba_buffer_); } } } 对视频view进行放大缩小等状态处理: @SuppressLint("ClickableViewAccessibility")public RGBSurfaceRenderer(SurfaceView view){ surface_holder_ = view.getHolder(); if (surface_holder_ == null) { Log.e(TAG, "RGBSurfaceRenderer, surfaceHolder with null.."); return; } surface_holder_.addCallback(this); view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.e(TAG, "onTouch called.."); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: start_point_.set(event.getX(), event.getY()); status_ = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: float distance = spacing(event); if (distance > 10f) { status_ = ZOOM; start_distance_ = distance; } break; case MotionEvent.ACTION_MOVE: if (status_ == DRAG) { dragAction(event); } else { if (event.getPointerCount() == 1) return true; zoomAcition(event); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: status_ = NONE; break; default: break; } return true; } }); } 关闭播放: if (isPlaying) { Log.i(TAG, "Stop playback stream++"); int iRet = libPlayer.SmartPlayerStopPlay(playerHandle); if (iRet != 0) { Log.e(TAG, "Call SmartPlayerStopPlay failed.."); return; } surface_renderer.StopRender(); libPlayer.SmartPlayerClose(playerHandle); playerHandle = 0; isPlaying = false; btnStartStopPlayback.setText("开始播放 "); Log.i(TAG, "Stop playback stream--"); }

优秀的个人博客,低调大师

IoT SaaS加速器——助力阿尔茨海默病人护理

场景介绍 阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病。据估计,全世界痴呆症患者数量为4700万,到2030年将达到7500万人。痴呆症患者数量到2050年预计将是现在的近三倍。疾病的高昂费用给卫生系统应对未来预计不断增加的病例构成挑战。据估计,目前每年的支出为8180亿美元,而支出的增长速度预计会比疾病流行率上升还要快。照料痴呆症患者给照护者带来巨大压力,包括身体上、情感上和经济上的压力。(by世界卫生组织) 用技术解决阿尔茨海默病护理的问题,让老人和其护理者有更好的生活质量,是我们可以解决的方法。基于物联网技术,已经有一些设备实现了阿尔茨海默病老人走失定位。但是我们要做更高一层,除了单独分发的硬件之外,我们要使用开发工具IoT Studio帮助医疗机构做一个硬件SaaS管

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册