android 仿弹幕功能实现(小记)

B站的DanmakuFlameMaster的使用 B站的DanmakuFlameMaster的使用 B站的DanmakuFlameMaster的下载地址:https://github.com/Bilibili/DanmakuFlameMaster    点击打开链接 1、弹幕内容解析 DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI) //xml解析 Dan 阅读详情

上周无意在郭神的博客中发现一篇关于弹幕的文章,自己想动手试试

效果图如下:


首先第一步引入依赖:

compile 'com.github.ctiao:DanmakuFlameMaster:0.5.3'

android studio 升级为3.0以上的版本依赖添加可以换成:

implementation 'com.github.ctiao:DanmakuFlameMaster:0.5.3'

布局很简单一个videoView +上我们引入依赖的DanmakuView 即可

首先 xml侧代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <VideoView
        android:id="@+id/vv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <master.flame.danmaku.ui.widget.DanmakuView
        android:id="@+id/dan_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <LinearLayout
        android:id="@+id/operation_layout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:background="#fff"
        android:visibility="gone">

        <EditText
            android:id="@+id/edit_text"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            />

        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Send" />
    </LinearLayout>
</RelativeLayout>

注:郭神的里面设置的启动横屏,我的没有设置,横屏可参考郭神的博客:https://blog.youkuaiyun.com/guolin_blog/article/details/51933728

java侧代码:

package com.example.rxjavademo;

import android.graphics.Color;
import android.net.Uri;
import android.os.Build;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.VideoView;

import java.util.Random;

import master.flame.danmaku.controller.DrawHandler;
import master.flame.danmaku.danmaku.model.BaseDanmaku;
import master.flame.danmaku.danmaku.model.DanmakuTimer;
import master.flame.danmaku.danmaku.model.IDanmakus;
import master.flame.danmaku.danmaku.model.android.DanmakuContext;
import master.flame.danmaku.danmaku.model.android.Danmakus;
import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
import master.flame.danmaku.ui.widget.DanmakuView;

public class MainActivity extends AppCompatActivity {

    private boolean showDanmaku;

    private DanmakuView danmakuView;

    private DanmakuContext danmakuContext;

    private BaseDanmakuParser parser = new BaseDanmakuParser() {
        @Override
        protected IDanmakus parse() {
            return new Danmakus();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        VideoView videoView =  findViewById(R.id.vv);

        final LinearLayout operationLayout =  findViewById(R.id.operation_layout);
        final Button send =  findViewById(R.id.send);
        final EditText editText =  findViewById(R.id.edit_text);

//        videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/mnt/shared/Other/wildlife.mp4");
        videoView.setVideoURI(Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.wildlife));
        videoView.start();

        danmakuView =  findViewById(R.id.dan_view);
        danmakuView.enableDanmakuDrawingCache(true);


        danmakuView.setCallback(new DrawHandler.Callback() {
            @Override
            public void prepared() {
                showDanmaku = true;
                danmakuView.start();
                generateSomeDanmaku();
            }

            @Override
            public void updateTimer(DanmakuTimer timer) {

            }

            @Override
            public void danmakuShown(BaseDanmaku danmaku) {

            }

            @Override
            public void drawingFinished() {

            }
        });
        danmakuContext = DanmakuContext.create();
        danmakuView.prepare(parser, danmakuContext);

        danmakuView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (operationLayout.getVisibility() == View.GONE) {
                    operationLayout.setVisibility(View.VISIBLE);
                } else {
                    operationLayout.setVisibility(View.GONE);
                }
            }
        });

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String content = editText.getText().toString();
                if (!TextUtils.isEmpty(content)) {
                    addDanmaku(content, true);
                    editText.setText("");
                }
            }
        });

        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) {
                    onWindowFocusChanged(true);
                }
            }
        });
    }

    /**
     * 向弹幕View中添加一条弹幕
     * @param content
     *          弹幕的具体内容
     * @param  withBorder
     *          弹幕是否有边框
     */
    private void addDanmaku(String content, boolean withBorder) {
        BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
        danmaku.text = content;
        danmaku.padding = 5;
        danmaku.textSize = sp2px(20);
        danmaku.textColor = Color.WHITE;
        danmaku.setTime(danmakuView.getCurrentTime());
        if (withBorder) {
            danmaku.borderColor = Color.GREEN;
        }
        danmakuView.addDanmaku(danmaku);
    }


    /**
     * 随机生成一些弹幕内容以供测试
     */
    private void generateSomeDanmaku() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(showDanmaku) {
                    int time = new Random().nextInt(300);
                    String content = "" + time + time;
                    addDanmaku(content, false);
                    try {
                        Thread.sleep(time);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    /**
     * sp转px的方法。
     */
    public int sp2px(float spValue) {
        final float fontScale = getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (danmakuView != null && danmakuView.isPrepared()) {
            danmakuView.pause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (danmakuView != null && danmakuView.isPrepared() && danmakuView.isPaused()) {
            danmakuView.resume();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        showDanmaku = false;
        if (danmakuView != null) {
            danmakuView.release();
            danmakuView = null;
        }
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }
}

视频资源我这边就不提供了你们可以随意去下载个视频加入到项目中即可。



参考博客:https://blog.youkuaiyun.com/guolin_blog/article/details/51933728

model下载:https://download.youkuaiyun.com/download/qq_36636969/10530528

Android 弹幕效果深度集成与实战 本文还有配套的精品资源,点击获取 简介:在Android开发中,通过集成DanmakuFlameMaster库实现弹幕效果,增强用户互动体验。本主题详细介绍如何利用该库进行弹幕绘制、管理及用户交互,涵盖绘制机制、数据结构、碰撞检测、速度控制、内存管理、自定义样式等关键点。实践步骤包括添加库依赖、创建DanmakuContext、设置视图、加载和发送弹幕、调整配置以及监听事件... 阅读详情

相关推荐

danmakuflamemaster

视频播放的弹幕控件。支持纯文字、图片、及图文混排。 特性: 使用多种方式(View/SurfaceView/TextureView)实现高效绘制 B站xml弹幕格式解析 基础弹幕精确还原绘制 支持mode7特殊弹幕 多核机型优化,高效的预缓存机制 支持多种显示效果选项实时切换 实时弹幕显示支持 换行弹幕支持/运动弹幕支持 支持自定义字体 支持多种弹幕参数设置 支持多种方式的弹幕屏蔽 还有,就是导入我的demo时,别忘了修改SDK的版本:android:targetSdkVersion="",改成你的,我用的是19

最强大的视频弹幕引擎——烈焰弹幕使(DanmakuFlameMaster)使用指南

简介B站在开源视频直播方面做出的贡献太大了,不仅开源视频控件ijkPlayer,还开源了弹幕引擎DanmakuFlameMaster,集齐整套,可谓神器在手,天下我有。 DanmakuFlameMaster 是 Android 上开源弹幕解析绘制引擎项目,也是 Android 上最好的开源弹幕引擎·烈焰弹幕。其架构清晰,简单易用,支持多种高效率绘制方式选择,支持多种自定义功能设置上。

linshijun33的专栏 2万+

最终篇——SWAT模型的建立

同理,Soil Data也是同样的方法导入,在Soil Database Options的选项中,选择UserSiol,用同样的方法导入土壤类型,进行重分类。打开窗口后,只定义HRU Thresholdes,其余两个不用设置,设定各数据单元的计算率,这里的10%的意思是计算精度,即分成级HRU计算单元太小,小于平均计算单元的10%,我们就不对这HRU单元进行计算(也就是说太破碎的计算单元不进行计算),若选择0%意味着全部进行计算,需要耗费大量的内存和时间,对计算机要求较高,不建议。

m0_72556434的博客 5621

开源弹幕引擎·烈焰弹幕使(DanmakuFlameMaster)使用解析

简介DanmakuFlameMaster 是 Android 上开源弹幕解析绘制引擎项目,也是 Android 上最好的开源弹幕引擎·烈焰弹幕。其架构清晰,简单易用,支持多种高效率绘制方式选择,支持多种自定义功能设置上。目前,DanmakuFlameMaster 开发包已被包括优酷土豆、开迅视频、MissEvan、echo回声、斗鱼TV、天天动听、被窝声次元、ACFUN 等 APP 使用。Featu

benhuo931115的博客 3万+

铝合金外壳表面处理工艺全解析:从阳极氧化到瓷泳喷涂的7种方法对比

本文全面解析了铝合金外壳的7种主流表面处理工艺,包括阳极氧化、粉末喷涂、瓷泳喷涂等。通过对比其原理、性能、成本与应用场景,为产品设计师和工程师提供了从防护性、装饰性到功能性的立体选型框架,帮助您根据具体需求选择最佳工艺方案。

weixin_29278805的博客 743

运维与软件实施课表

运维与软件实施课表 课程 章节编号 章节 课程地址 软件及操作系统基础 ch01 软件及操作系统基础01 实施、运维工程师基本技能:https://blog.youkuaiyun.com/qq_28189423/article/details/82700539 老毛桃制作winPE镜像:https://blog.youkuaiyun.com/qq_2818942...

Mr.O~的博客 1万+

【Android -- 开源库】DanmakuFlameMaster 的基本使用

Android 上开源弹幕解析绘制引擎项目。

Kevin Learn Android 2813

Tomcat漏洞——弱口令爆破

靶机:CentOS7 IP:192.168.100.40。攻击机:kali IP:192.168.100.60。版 权 声 明:本博客所有文章除特别声明外,均采用。文章版权归作者所有,未经允许请勿转载!作 者:PeiyuJue。

weixin_57379923的博客 909

各大项目所用到的技术小记~汇总~持续更新

YST 1. 项目没有上线,使用企业账号打包,检测更新用的是FIR技术: +(void)checkForUpdateInFIR:(FIResultBlock)callback apiToken:(NSString *)apiToken; 2.

CC的专栏 866

【rt-thread实战解析】从零到一:基于STM32与LAN8720A的以太网驱动配置全流程

本文详细解析了在RT-Thread操作系统上为STM32F407配置LAN8720A以太网驱动的全流程。从硬件连接自查、CubeMX工程创建、PHY复位函数编写,到RT-Thread工程配置、LwIP协议栈集成,最后进行实际上电测试与网络调试,手把手指导开发者避开常见陷阱,实现稳定的以太网连接。

m2n3b4v5c6的博客 525

Mac 安装neo4j(解压版)最新版本教程

本文介绍了在Mac M系列操作系统上安装Neo4j图数据库的具体步骤。内容包括:从官网下载解压版Neo4j社区版压缩包;通过终端命令将其解压到/opt目录并重命名;配置环境变量以便全局访问;以及常用命令如启动/停止服务、重置密码等。安装完成后,用户可通过浏览器访问http://localhost:7474,使用默认账号neo4j/neo4j登录并根据提示重置密码。该教程简洁明了地指导用户完成Neo4j在Mac上的安装配置过程。

猿小白的博客 909

告别App横跳:Simple Live直播聚合上手记

**那个在四个App之间横跳的夜晚** 你大概也遇到过这种尴尬:想看的比赛在虎牙,追的主播常驻B站,晚上刷抖音又撞见有人开播——手机里装着四五个直播软件,内存越来越挤,通知栏吵个不停,遇到精彩瞬间还得手忙脚乱地切换。**Simple Live** 正是为解决这个烦恼而生的**直播聚合**工具:它把虎牙、斗鱼、哔哩哔哩、抖音等主流平台的直播内容收进同一个应用里,手机、电脑、电视都能用。读完这篇文章

gitblog_01096的博客 422

【图像超分】论文精读:SRConvNet: A Transformer-Style ConvNet for Lightweight Image Super-Resolution

本文提出了一种轻量级图像超分辨率重建方法SRConvNet,结合了卷积神经网络和Transformer的优势。针对传统Transformer计算复杂度高的问题,设计了傅立叶调制注意力(FMA)替代自注意力机制,通过区域频率空间调制实现高效的全局依赖建模;同时引入动态混合层(DML),采用混合尺度动态卷积结合通道拆分机制增强局部特征提取。实验表明,SRConvNet在计算效率和参数数量上显著优于现有轻量级超分方法,同时保持了优异的重建性能。该方法为移动端部署提供了有效的解决方案,在精度与复杂度间取得了良好平衡

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 808

【亲测免费】 DanmakuFlameMaster 教程

**DanmakuFlameMaster** 是哔哩哔哩(B站)开发的一个开源项目,它是一款强大的Android弹幕渲染引擎。该项目旨在提供高效且自定义程度高的弹幕播放器组件,使得开发者能够轻松地在自己的应用程序中集成类似于视频网站中的实时弹幕互动功能。DanmakuFlameMaster支持XML格式的弹幕数据解析,并提供了灵活的弹幕样式设置和动画效果。 ## 2. 项目快速启动 ### 准...

gitblog_00401的博客 676

PMP第一章:引论介绍

PMP第一章:引论介绍 1.PMBOK指南概述和目的 项目管理标准 通用词汇 道德与专业行为规范 2.基本要素 项目 项目管理的重要性 项目、项目集、项目组合以及运营管理之间的关系 指南的组成部分 裁剪 项目管理商业文件 3.项目管理标准 标准是基于权威、惯例或共识而建立并用作模式或范例的文件。 标准确认了在大多数时候都被大多数项目视作良好实践的过程。 4.道德与专业行为规范 责任:对自己所做的决策或未做决策、所采取的行为或未采取行为,以及相应的后果,承担责任 尊重:对自己、他人和委托给自己的资源

zhengzaifeidelushang的博客 826

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【亲测免费】 《Danmaku FlameMaster: 创新的弹幕渲染引擎》

《Danmaku FlameMaster: 创新的弹幕渲染引擎》 在当今的互联网时代,弹幕文化已经成为了视频分享平台的一大特色。用户们通过发送弹幕参与互动,这种实时的交流方式使得观看体验更加生动有趣。而今天我们要介绍的开源项目——,就是这样一款专为高效、流畅的弹幕渲染打造的强大引擎。 项目简介 Danmaku FlameMaster 是一个由 C++ 开发的高性能弹幕渲染库,它支持多种操作系统,包...

gitblog_00071的博客 636

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

弹幕框架DanmakuFlameMaster简单分析

       随着B站逐渐崛起,其开源弹幕项目DanmakuFlameMaster应用场景也越来越多。我也是在一次偶然机会下发现了这个项目,被其惊艳的效果震撼。以前我就对弹幕技术很感兴趣,可能是因为B站动漫看多,几乎每一部番都是漫天的弹幕乱飞,如果哪部剧没有弹幕反而觉得不适应;久而久之就愈发倾向钻研其原理。       看到效果后,我猜想绘制原理应该是创建一个定时器作为全部弹幕的时间参考,然后每条...

HsuanKeny的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【亲测免费】 DanmakuFlameMaster 开源项目使用教程

DanmakuFlameMaster 开源项目使用教程 1. 项目目录结构及介绍 DanmakuFlameMaster 是一个专为Android平台设计的高效弹幕引擎。以下是其大致的项目目录结构及各部分功能简介: DanmakuFlameMaster/ ├── app # 示例应用模块,含主要逻辑与界面展示 │ ├── src │ └── main...

gitblog_00091的博客 810

Android弹幕框架 黑暗火焰使

笑谈风云,一语定乾坤。大家好,我是皖江。 今天我将分享由BiliBili开源的Android弹幕框架(DanmakuFlameMaster)的学习经验。

皖江的博客 6114

DanmakuFlameMaster 安装和配置指南

### 项目基础介绍 DanmakuFlameMaster 是一个开源的 Android 弹幕引擎项目,由 Bilibili 开发并维护。它能够高效地解析和绘制弹幕,支持多种弹幕格式和显示效果,适用于各种 Android 应用场景。 ### 主要编程语言 该项目主要使用 Java 语言编写,同时也包含一些 C/C++ 代码用于性能优化。 ## 2. 项目使用的关键技术和框架 ### 关键技术...

gitblog_07984的博客 817

安卓漫漫路之实现简单的弹幕.

直播和看视频中越来越火的控件---弹幕(Danmaku) 本文即介绍怎样实现简单的弹幕效果:咱们使用的是哔哩哔哩开源的弹幕效果库 DanmakuFlameMaster. 必需:首先咱们在项目主工程app/build.gradle中的dependencies闭包中添加如下依赖: compile 'com.github.ctiao:DanmakuFlameMaster:0.5.

HighForehead的博客 3153

DanmakuFlameMaster控制器模块详解:弹幕生命周期的管理者

在视频播放应用中,弹幕(Danmaku)功能已成为增强用户互动体验的关键组件。Android开源弹幕引擎DanmakuFlameMaster(烈焰弹幕使)通过其模块化设计,实现了高性能、可扩展的弹幕渲染系统。本文将深入解析控制器模块的核心架构与工作原理,揭示其如何管理弹幕从创建到销毁的完整生命周期。 ## 控制器模块架构概览 DanmakuFlameMaster的控制器模块位于[Danmaku...

gitblog_00772的博客 947

利用B站弹幕引擎(Danmaku)轻松实现弹幕功能

弹幕在直播中是一个比较重要的功能,而开源的B站弹幕可以让我们轻松的实现这个功能。 其实现原理大概就是在页面的上方盖了一层全透明的View,然后再View中添加需要的弹幕效果。 上图: 1、首先,在项目中添加依赖: implementation 'com.github.ctiao:DanmakuFlameMaster:0.5.3' 其次,就在xml文件中添加覆盖的透明View <master.flame.danmaku.ui.widget.DanmakuView android:id="@

lixinxiaos的博客 1万+

弹幕框架

弹幕框架DanmakuFlameMaster浅要分析

jt_ontheway的博客 3139

DanmakuFlameMaster 常见问题解决方案

DanmakuFlameMaster 是一个开源的 Android 弹幕引擎项目,由 Bilibili 开发并维护。该项目的主要目的是提供一个高效、灵活的弹幕渲染引擎,支持多种弹幕格式和显示效果。项目的主要编程语言是 Java,同时也涉及到一些 C/C++ 代码用于性能优化。 ## 新手使用注意事项及解决方案 ### 1. 弹幕格式解析问题 **问题描述**:新手在使用 DanmakuFla...

gitblog_07986的博客 759

自定义View实战《弹幕》

前面已经学习了自定义的View《渐变色的文字》是继承View的。现在我们在继承ViewGroup来实现我们的《弹幕》View。本文分为三部分1、步骤讲解和分步实战2、缓存优化3、三方弹幕框架DanmakuFlameMaster4、第一步初步实现的完整代码继承View和ViewGroup实现的View有什么明显的区别吗?自定义View主要实现的是onMeasure和onDraw自定义ViewGroup主要实现的是onMeasure和onLayout。

小孟来码的博客 5896
上一篇: 使用自定义view事项图片的放大缩小(之小记)
下一篇: android studio 设置model设置为library
贪吃的小耳朵
博客等级 码龄10年 20粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值