仅用5个线程,让Idea全系列Ide能看电视、直播、电影、听广播、音乐、美女图

您所在的位置:网站首页 放动画电影歌曲 仅用5个线程,让Idea全系列Ide能看电视、直播、电影、听广播、音乐、美女图

仅用5个线程,让Idea全系列Ide能看电视、直播、电影、听广播、音乐、美女图

2024-07-11 17:35:11| 来源: 网络整理| 查看: 265

前言

好久没有写关于技术类型的文章了,很多朋友都催我写写,这也快到年底了,所有抽了点时间写一篇,希望能借此来回馈大家在过去一年中对我的支持。

PS:本文中有3张GIF效果图太大,没办法上传,追求看完美效果的朋友可以摆驾链接:百度网盘 请输入提取码    提取码:xad4 插件高清GIF效果。

需求

今天要分享的技术方案是我在写bg-boom这款插件当中一小块的代码实现方案,先从需求说起吧,其模块整体的需求是丰富idea的背景功能,具体需求为:

让idea背景功能支持图片

让idea背景功能支持gif图片

让idea背景功能支持视频(既动态桌面的效果)

让idea背景功能支持广播收听

让idea背景功能支持TV在线收看

让idea背景功能支持直播在线收看(要支持MMS、RTMP、RTCP、RTSP、M3U8等直播流协议)

让idea背景功能支持音乐在线播放(既实现在线音乐播放器的功能)

让idea支持从网页中自动爬取图片、视频、直播流等资源自动播放

让idea所有产品都能够支持以上功能,包括但不限于IntelliJ IDEA、WebStorm、DataGrip 、Android Studio、CLion 、PhpStorm 、PyCharm等产品

让idea在linux、window、mac平台上也支持以上功能

效果

以上需求文字理解较为晦涩难懂,就先看看最终的实现效果,感受一下需求最终实现的效果吧:

PS:由于gif太大,在这里我只放了一张网络视频的效果图,要听声音的朋友可以转看,效果更佳: Idea炫酷的视频背景插件Bg-boom_哔哩哔哩_bilibili

现状分析

简单理解以上需求后,总是要撸起袖子干事情的,就先从idea现状对背景的支持开始吧,经过一番源码的阅读操作,最终可以发现idea背景功能支持有些简单,如下:

idea自身支持背景功能(万幸)

idea只支持背景图片(非常遗憾视频不支持)

idea支持图片的翻转、平铺、透明度等样式微调

2021.2.3版本的背景功能截图如下(不同产品和版本可能存在差异):

架构设计

通过对idea现状分析后,可以清晰的得出一个结论就是:要实现自己的需求,那么基本是对背景功能的重新实现。Do it!

第一步:拆分需求功能

先归纳一下在需求描述中对于实现的关键点,是让idea支持图片、gif图片、视频、直播、广播、在线音乐的支持。就这样理解还是不够直观,那就再做一次抽象转换:

图片=图片

gif图片=图片+图片(PS:是由多帧图片组成)

视频=图片+声音(PS:视频就是由多帧图片和声音组成)

直播=图片+声音(PS:直播就是由多帧图片和声音组成)

电影=图片+声音(PS:电影就是由多帧图片和声音组成)

广播=声音(PS:广播就是由声音组成)

音乐=声音(PS:音乐就是由声音组成)

经过这次转换我们就可以清楚的发现,需求中提出的功能实际对于idea来说就是单独放图片、单独放声音、同时放图片和声音的需求,是不是顿时简单好理解一大半。

总结:拆分后的需求就是要求idea可以背景播放图片和声音,图片和声音可在一定条件下单独开启。

第二步:架构设计

理解拆分需求之后,软件需要实现图片和声音的同时播放,因此可以先架构两个并行的线程:

声音播放线程:主要用于输出声音数据到声卡

背景播放线程:主要用于输出图片到idea背景

Q1:背景图片播放能重用Idea自动的背景功能吗? A1:通过源码的分析,Idea背景图片的功能,存在深度缓存,并且存在系列不必要的计算,在性能上不太满足视频的播放需要,因此背景功能也需要重实现。

在idea中图片可以直接支持,但是视频、流需要自己实现解析,因此还需要架构两个线程来完成视频、流的解析工作:

多媒体解码线程:主要用于获取视频、直播、音乐、TV、当中的图片和声音解码,并推送给多媒体播放线程播放

多媒体播放线程:主要实现一个播放时钟,到播放点把声音和图片推送给对应线程进行播放处理

Q2:为什么不在解码线程中直接推送声音和图片播放? A2:简单说,10M的视频,解码指需要1s钟,但是播放可能需要持续3分钟,这个过程中性能处理是不对等的;再加上多媒体中声音和图片存在数据交叉情况,最终还是分成2个线程来处理,较为简单易维护。 ​ Q3:多媒体播放线程只是到点推送播放数据的功能吗? A3:多媒体播放线程除了推送播放数据的功能,其实还有一个非常重要的功能,就是协调声音和图片画面的同步问题;因为在声音和画面在并行两个线程中执行,一个线程执行慢一点,就会导致声音和画面的不一致,这种现象当然需要考虑并解决。

在实现过程中,由于性能和体验的权衡,最终把方法调整成为用5个并行线程来实现整个功能。

背景刷屏线程:主要把背景图片绘制到idea背景显示

背景播放线程:调整后,最终只会把要输出的图片放置到背景缓存区中,不负责显示图片

Q4:为什么增加背景刷屏线程? A4:在调优过程中,发现idea背景输出引起的GUI界面刷新不能在短时间内完成,因此画面延迟出现的情况出现较为频繁。为解决此问题,设计一个背景缓冲区,缓冲区内的图片只存储即将显示的那张图片,如果背景刷屏线程过慢,就会导致缓冲区中的图片被新的缓存图片所覆盖,这样的效果恰是画面延迟后跳帧显示画面的效果。因此巧妙的实现了当前idea画面刷新延迟时,跳帧显示图片,以达到声音和图片同步的效果。因此增加此线程,即为明智。

看到这里,不容易,看会电视先休息一下吧~~

技术选型

以上需求要实现,用到的技术其实并不多,简单介绍一下以上方案的关键技术选型:

视频解码:选型使用的是javacv;(ps:java对视频解码支持并不完善,只能借助javacv完成,实际上javacv是封装了ffmpeg)

线程同步:这里5个线程之间需要协作同步,主要使用ReentrantLock锁来同步

画面显示:画面显示不需要特殊技术,重新Idea的PaintersHelper即可,但由于idea源代码的作用域限制,实现改步需要使用大量反射操作来完成

技术实现

由于实现的代码过多,再这里就不粘贴出来了,感兴趣的同学可以到我个人订阅号领取:

扫描订阅

在订阅号

回复【视频代码】4个字领取以上功能的多线程实现源码

回复【动态背景】4个字查看效果演示视频

性能优化

感兴趣代码实现的朋友可以同上述方式,自行领取资料。在这里我主要分享一下实现完成功能之后对代码的优化过程。

01、完成第一版发现问题

功能基本实现完成之后,发现运行效果能达到预期,但是CPU占用非常高,如下图:

下图中带有 madou、javacv、ffmpeg都是自身程序的实现,发现占用CPU非常高

02、拆包定位性能消耗点

在com.madou.app.vedio.core和thread包中都有多个实现类,不够直观发现那个类会有问题,因此建立多个包,每个包下只放一个类文件,再次运行:

PS:下图中第一次CPU占406%,第二次占270%,这是由计算机自身的状态产生的偏差,在此忽略。

从下图可以看出:

com.madou.app.vedio.print占用非常高,其下面的类主要用于把图片刷新到idea背景区域显示

com.madou.app.vedio.audio占用非常高,其下面的类主要是进行声音解码和声音播放的代码

03、原因分析

先分析com.madou.app.vedio.print包,其下面只有一个用于把Image绘制到Idea背景区域显示的程序,非常简单,貌似此代码的优化空间不太大,先跳过。

private void drawGraphics(Image image, Graphics2D g, Rectangle dstBounds) {    if(image!=null) {        g.drawImage(image,dstBounds.x,dstBounds.y,                                  Double.valueOf(dstBounds.getWidth()).intValue(),                                  Double.valueOf(dstBounds.getHeight()).intValue(),null);   } }

解密帧数据

public byte[] parseToByte(Buffer[] samples) {        if(samples==null){            return null;       }        int k;        buf = samples;        switch(sampleFormat){            case avutil.AV_SAMPLE_FMT_FLTP://平面型左右声道分开。                leftData = (FloatBuffer)buf[0];                TLData = floatToByteValue(leftData,vol);                rightData = (FloatBuffer)buf[1];                TRData = floatToByteValue(rightData,vol);                tl = TLData.array();                tr = TRData.array();                combine = new byte[tl.length+tr.length];                k = 0;                for(int i=0;i


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭