swift对象存储环境搭建

    关于swift对象存储,国内的资料太少了,网上能找到的可用的寥寥无几,大都是只言片语,官网个人觉得写得也不是特别好,不是很好理解,本人不才
打算把这些年使用swift对象存储的经验慢慢整理分享给大家,本篇先从基础环境搭建开始,最后会写到java对swift对象存储的使用。所有分享出来的都是
我亲身实验过的,有问题欢迎大家留言。关于swift对象存储是什么网上有写的比较好的文章我就不再复述了,如下开始搭建一个实验环境。
   
    
 
三台服务器的ip
192.168.0.101
192.168.0.102
192.168.0.103
注:三台服务器每台服务器使用一块硬盘,搭建一个对象存储集群。如果是生产环境可能需要更多的服务器和磁盘  


一、配置yum源
    [root@kangvcar ~]# cd /etc/yum.repos.d/
 
    [root@kangvcar ~]# cat /etc/redhat-release        //查看系统的版本
        CentOS Linux release 7.2.1511 (Core)
    [root@kangvcar ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
        --2017-06-20 06:43:08--  http://mirrors.aliyun.com/repo/Centos-7.repo
        Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 112.124.140.210, 115.28.122.210
        Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|112.124.140.210|:80... connected.
        HTTP request sent, awaiting response... 200 OK
        Length: 2573 (2.5K) [application/octet-stream]
        Saving to: ‘/etc/yum.repos.d/CentOS-Base.repo’
        100%[=======================================================================================================>] 2,573       --.-K/s   in 0s      
        2017-06-20 06:43:08 (118 MB/s) - ‘/etc/yum.repos.d/CentOS-Base.repo’ saved [2573/2573]
 
 
       [root@kangvcar ~]# yum clean all
        Loaded plugins: fastestmirror
        Cleaning repos: base extras updates
        Cleaning up everything
        Cleaning up list of fastest mirrors
    [root@kangvcar ~]# yum makecache        //把yum源缓存到本地,加快软件的搜索好安装速度
    [root@kangvcar ~]# yum list        //总共列出了9954个包
 
 
二、安装各种依赖
    sudo yum install curl gcc memcached rsync sqlite xfsprogs git-core \
    libffi-devel xinetd liberasurecode-devel \
    python-setuptools \
    python-coverage python-devel python-nose \
    pyxattr python-eventlet \
    python-greenlet python-paste-deploy \
    python-netifaces python-pip python-dns \
    python-mock
 
三、查看磁盘类型是不是xfs 是就不用管,不是需要重新分区格式化成xfs
    [root@node01 opt]# parted -l
 
    --大磁盘分区请参照如下链接地址
        http://www.blogjava.net/haha1903/archive/2011/12/21/366942.html
    
四、下载swift-client、swift
        git clone https://github.com/openstack/python-swiftclient.git
    git checkout 2.4.0    
    
    git clone https://github.com/openstack/swift.git
    git checkout 2.4.0

五、创建目录
        mkdir -p /opt/soft
    mkdir -p /opt/swift-disk/sdb1
    
    将上一步下载的两个文件放到/opt/soft目录下
    
六、安装    
     cd /opt/soft/python-swiftclient
    [root@node01 opt]# python setup.py develop;
 
    cd  /opt/soft/swift
    [root@node01 swift]# pip install -r requirements.txt;
    [root@node01 swift]# pip install --upgrade pip
    [root@node01 swift]# sudo python setup.py develop;
    
七、配置 /etc/rc.local  当前也要执行
    sudo mkdir -p /var/run/swift
    sudo mkdir -p /var/cache/swift
    
八、配置 rsync
    vi /etc/rsyncd.conf
    
    # /etc/rsyncd: configuration file for rsync daemon mode
    uid = root
    gid = root
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    address = 0.0.0.0

    [account]
    max connections = 25
    path = /opt/swift-disk/
    read only = false
    lock file = /var/lock/account.lock

    [container]
    max connections = 25
    path = /opt/swift-disk/
    read only = false
    lock file = /var/lock/container.lock

    [object]
    max connections = 25
    path = /opt/swift-disk/
    read only = false
    lock file = /var/lock/object.lock
    
九、启动 rsync 并设置开机启动    
    systemctl start rsyncd.service
    systemctl enable rsyncd.service
 
十、启动 memcached 并设置开机启动   
    systemctl start memcached.service
    systemctl enable memcached.service
    
十一、配置swift相关的配置文件
    (1)创建 swift 配置文件 /etc/swift/swift.conf
     vi /etc/swift/swift.conf
        [swift-hash]
        #echo `od -t x8 -N 8 -A n </dev/random` 生成随机数填写
        swift_hash_path_suffix= EvjucvFN5aX1oAdjlQiw5+HV0JUqSSWwzoiem+fLAZE=
        
    (2)配置 account 服务 /etc/swift/account-server.conf
       vi /etc/swift/account-server.conf
        [DEFAULT]
        devices = /opt/swift-disk
        mount_check = false
        bind_ip = 0.0.0.0
        bind_port = 6002
        workers = 4
        user = root
        log_facility = LOG_LOCAL4

        [pipeline:main]
        pipeline = account-server

        [app:account-server]
        use = egg:swift#account

        [account-replicator]
        [account-auditor]
        [account-reaper]
    (3)配置 container 服务 /etc/swift/container-server.conf
        vi /etc/swift/container-server.conf
        [DEFAULT]
        devices = /opt/swift-disk
        mount_check = false
        bind_ip = 0.0.0.0
        bind_port = 6001
        workers = 4
        user = root
        log_facility = LOG_LOCAL3
        [pipeline:main]
        pipeline = container-server
        [app:container-server]
        use = egg:swift#container
        [container-replicator]
        [container-updater]
        [container-auditor]
        [container-sync]
    (4)配置 object 服务 /etc/swift/object-server.conf
       vi  /etc/swift/object-server.conf
       [DEFAULT]
        devices = /opt/swift-disk
        mount_check = false
        bind_ip = 0.0.0.0
        bind_port = 6000
        workers = 4
        user = root
        log_facility = LOG_LOCAL2
        [pipeline:main]
        pipeline = object-server
        [app:object-server]
        use = egg:swift#object
        [object-replicator]
        [object-updater]
        [object-auditor]
    (5)配置 proxy 服务 /etc/swift/proxy-server.conf
    vi /etc/swift/proxy-server.conf
    [DEFAULT]
    bind_port = 8080
    user = root
    workers = 8
    log_facility = LOG_LOCAL1

    [pipeline:main]
    pipeline = healthcheck cache tempauth proxy-logging proxy-server

    [app:proxy-server]
    use = egg:swift#proxy
    allow_account_management = true
    account_autocreate = true

    [filter:tempauth]
    use = egg:swift#tempauth
    user_admin_admin = admin .admin .reseller_admin
    user_test_tester = testing .admin
    user_test2_tester2 = testing2 .admin
    user_test_tester3 = testing3
    reseller_prefix = AUTH
    token_life = 86400
    # account和token的命名前缀,注意此处不可以加"_"。
    # 例如X-Storage-Ur可能l为http://127.0.0.1:8080/v1/AUTH_test
    # 例如X-Auth-Token为AUTH_tk440e9bd9a9cb46d6be07a5b6a585f7d1# token的有效期,单位:秒。

    [filter:healthcheck]
    use = egg:swift#healthcheck

    [filter:cache]
    use = egg:swift#memcache

    # 这里可以是多个memcache server,proxy会自动当作一个集群来使用# 例如 memcache_servers = 192.168.2.129:11211,192.168.2.130:11211,192.168.2.131
         memcache_servers = 192.168.0.101:11211,192.168.0.102:11211,192.168.0.103:11211
    
    [filter:proxy-logging]
    use = egg:swift#proxy_logging
        
十二、创建 ring 文件    
        cd /etc/swift
    swift-ring-builder account.builder create 18 3 1
    swift-ring-builder container.builder create 18 3 1
    swift-ring-builder object.builder create 18 3 1    
    注:需要事先创建好3个 ring,18 表示 partition 数为2的18次方,3表示 replication 数为3,1 表示分区数据的最短迁移间隔时间为1小时。(官网说明里如果移除设备的话不在这个限制内)
    
十三、向ring 中加入设备   后面的100是权重建议使用磁盘的实际大小,如果磁盘上100G权重就设置100
    swift-ring-builder account.builder add z1-192.168.0.101:6002/sdb1 100
    swift-ring-builder container.builder add z1-192.168.0.101:6001/sdb1 100
    swift-ring-builder object.builder add z1-192.168.0.101:6000/sdb1 100

    swift-ring-builder account.builder add z2-192.168.0.102:6002/sdb1 100
    swift-ring-builder container.builder add z2-192.168.0.102:6001/sdb1 100
    swift-ring-builder object.builder add z2-192.168.0.102:6000/sdb1 100

    swift-ring-builder account.builder add z3-192.168.0.103:6002/sdb1 100
    swift-ring-builder container.builder add z3-192.168.0.103:6001/sdb1 100
    swift-ring-builder object.builder add z3-192.168.0.103:6000/sdb1 100

    注:z1 和 z2 表示 zone1 和 zone2(zone 这个概念是虚拟的,可以将一个 device 划定到一个 zone,在分配 partition 的时候会考虑到这个因素,尽量划分到不同的 zone 中)。
    sdb1 为 swift 所使用的存储空间。
    100 代表设备的权重,也是在分配 partition 的时候会考虑的因素。    
    
 
    
十四、确认ring 的内容是否正确:
    swift-ring-builder account.builder
    swift-ring-builder container.builder
    swift-ring-builder object.builder
    
十五、平衡(Rebalance) ring
    swift-ring-builder account.builder rebalance
    swift-ring-builder container.builder rebalance
    swift-ring-builder object.builder rebalance
    
    
    一键启动 swift 的所有服务。
    #!/bin/bash
    swift-init proxy start
    swift-init account-server start
    swift-init account-replicator start
    swift-init account-auditor start
    swift-init container-server start
    swift-init container-replicator start
    swift-init container-updater start
    swift-init container-auditor start
    swift-init object-server start
    swift-init object-replicator start
    swift-init object-updater start
    swift-init object-auditor start
 
    
    关闭服务
    #!/bin/bash
    swift-init proxy stop
    swift-init account-server stop
    swift-init account-replicator stop
    swift-init account-auditor stop
    swift-init container-server stop
    swift-init container-replicator stop
    swift-init container-updater stop
    swift-init container-auditor stop
    swift-init object-server stop
    swift-init object-replicator stop
    swift-init object-updater stop
    swift-init object-auditor stop        
    
    
        
    
十六、常用语句
    1、直接使用 swift 客户端程序进行操作(帮助文档[root@node01]# swift --help)
        (1)查看账户信息(账户是/etc/swift/proxy-server.conf里配置的)
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin stat    
    
        (2)创建 container
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin post container1    
        
        (3)查看 test 用户的 container 列表
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin list

        (4)查看容器中的内容
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin list container1
 
        (5)上传Object(文件),上传 3.txt 文件到 container1 容器中
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin upload container1 3.txt
            
            上传其他路径的文件
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin upload container1 /opt/4.txt  --object-name 4.txt
        
        (6)下载Object(文件)
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin download container1 3.txt
            
            将文件下载到其他路径
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin download container1 3.txt --output /opt/3.txt
            
            下载该用户下所有文件
            [root@node01 swift-disk]# swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin download  --all
    
        (7)删除文件
             swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin delete container1  3.txt    
    
        (8)查看集群的基本信息(List cluster capabilities)    
            swift -A http://127.0.0.1:8080/auth/v1.0 -U admin:admin -K admin  capabilities
            
            
        (9)查看文件存储的物理位置(查看其它用法 swift-get-nodes --help)
             查看账户信息在哪里:swift-get-nodes -a /etc/swift/account.ring.gz AUTH_admin   
             查看容器信息在哪里:swift-get-nodes -a /etc/swift/container.ring.gz AUTH_admin container1
             查看文件信息在哪里:swift-get-nodes -a /etc/swift/object.ring.gz AUTH_admin container1 1.txt    
            
    2、RESTful API(账户是/etc/swift/proxy-server.conf里配置的)
        所有的操作都需要先获取一个 auth-token,之后的所有操作都需要在 header 中附加上 X-Auth-Token 字段的信息进行权限认证。有一定时效性,过期后需要再次获取。    
    (1)获取 X-Storage-Url 和 X-Auth-Token    
        curl http://127.0.0.1:8080/auth/v1.0 -v -H 'X-Storage-User: admin:admin' -H 'X-Storage-Pass: admin'
        或:curl http://192.168.0.102:8080/auth/v1.0 -v -H 'X-Storage-User: admin:admin' -H 'X-Storage-Pass: admin'
        
        
        * About to connect() to 127.0.0.1 port 8080 (#0)
        *   Trying 127.0.0.1...
        * Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
        > GET /auth/v1.0 HTTP/1.1
        > User-Agent: curl/7.29.0
        > Host: 127.0.0.1:8080
        > Accept: */*
        > X-Storage-User: admin:admin
        > X-Storage-Pass: admin
        < HTTP/1.1 200 OK
        < X-Storage-Url: http://127.0.0.1:8080/v1/AUTH_admin
        < X-Auth-Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36
        < Content-Type: text/html; charset=UTF-8
        < X-Storage-Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36
        < X-Trans-Id: tx703a6ebfbfca46a49f605-005c1878e0
        < Content-Length: 0
        < Date: Tue, 18 Dec 2018 04:34:40 GMT
        <
        * Connection #0 to host 127.0.0.1 left intact
    (2)查看账户信息    
        curl http://127.0.0.1:8080/v1/AUTH_admin -v -H 'X-Auth-Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36'
        
        * About to connect() to 127.0.0.1 port 8080 (#0)
        *   Trying 127.0.0.1...
        * Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
        > GET /v1/AUTH_admin HTTP/1.1
        > User-Agent: curl/7.29.0
        > Host: 127.0.0.1:8080
        > Accept: */*
        > X-Auth-Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36
        >
        < HTTP/1.1 200 OK
        < Content-Length: 11
        < X-Account-Object-Count: 2
        < X-Account-Storage-Policy-Policy-0-Bytes-Used: 11
        < X-Account-Storage-Policy-Policy-0-Container-Count: 1
        < X-Timestamp: 1545104875.82331
        < X-Account-Storage-Policy-Policy-0-Object-Count: 2
        < X-Account-Bytes-Used: 11
        < X-Account-Container-Count: 1
        < Content-Type: text/plain; charset=utf-8
        < Accept-Ranges: bytes
        < X-Trans-Id: txea708b3ecf3047099ea6f-005c187945
        < Date: Tue, 18 Dec 2018 04:36:21 GMT
        <
        container1
    (3) 创建 container(container2为创建的容器名称)
        curl http://127.0.0.1:8080/v1/AUTH_admin/container2 -X PUT -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
        
 
     (4)各种操作总结(参考网页https://blog.csdn.net/ztejiagn/article/details/8905782)
        例如:
        <1>获取AUTH_admin账户下的容器列表
            curl http://127.0.0.1:8080/v1/AUTH_admin/ -X GET -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
 
        <2>获取AUTH_admin账户下的容器container1的对象列表
            curl http://127.0.0.1:8080/v1/AUTH_admin/container1 -X GET -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
        
        <3>创建、更新或拷贝对象
            curl http://127.0.0.1:8080/v1/AUTH_admin/container1/1.txt  -X PUT -T 1.txt -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
        
            其他路径下的文件
            curl http://127.0.0.1:8080/v1/AUTH_admin/container1/2.txt  -X PUT -T /opt/node/2.txt -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
        <4>获取对象内容和元数据
            curl http://127.0.0.1:8080/v1/AUTH_admin/container1/2.txt  -X GET  -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
        
        <5>删除对象
            curl http://127.0.0.1:8080/v1/AUTH_admin/container1/2.txt  -X DELETE -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"        
          
                 
        
其他有用
CentOS7使用firewalld打开关闭防火墙与端口
1、firewalld的基本使用
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用  : systemctl disable firewalld
开机启用  : systemctl enable firewalld
        
2、日志在
swift日志
    /var/log/messages    
同步日志
   /var/log/rsyncd.log            
        
        
        
        
        
        
       

原文地址:https://www.cnblogs.com/yclh/p/14761420.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。