将音频文件转二进制分包存储到Redis(奇淫技巧操作)

2024-01-26 19:48

本文主要是介绍将音频文件转二进制分包存储到Redis(奇淫技巧操作),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、
功能需求:

一、获取本地音频文件,进行解析成二进制数据音频流

二、将音频流转化成byte[]数组,按指定大小字节数进行分包

三、将音频流分成若干个包,以List列表形式缓存到redis数据库中

四、从redis数据库中获取数据,转换成音频流输出到浏览器播放、实现音频下载功能

程序如下:

1.在SpringBootpom.xml文件中添加Redis依赖

  <!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2.在SpringBoot配置文件中添加以下配置

# 服务端口
server:port: 8080spring:
#reids配置
redis:host: 127.0.0.1 # Redis服务器地址database: 1 # Redis数据库索引(默认为0)port: 6379 # Redis服务器连接端口password: # Redis服务器连接密码(默认为空)jedis:pool:max-active: 8 # 连接池最大连接数(使用负值表示没有限制)max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)max-idle: 8 # 连接池中的最大空闲连接min-idle: 0 # 连接池中的最小空闲连接timeout: 3000ms # 连接超时时间(毫秒)

3.创建RedisTemplate对象操作redis

RedisTemplate介绍:
说的通俗一点…为了让Spring框架体系能够更加方便的接入Redis的功能,RedisTemplate其实就是Spring框架对Jedis的封装…是 spring-data-redis中使用redis的模版。

/*** 创建redisTemplate对象操作redis*/@Resourceprivate RedisTemplate<String,Object> redisTemplate;

4.主业务数据处理读取音频文件进行转换存储

通过FileInputStream对象把音频文件转换成byte[]数组,进行分包,把分好包的字节数据添加到List集合中,在调用RedisTemplate对象的opsForList().rightPushAll方法批量添加参数List元素,以Redis的列表数据格式存储。

/*** 获取文件将文件转换成byte[]数组,进行分包存储到redis*/@RequestMapping("/setAudio")@ResponseBodypublic Object getsty() throws Exception {File file = new File("E:/zmj-3011-32779/12121.mp3");FileInputStream inputFile = new FileInputStream(file);byte[] buffer = new byte[(int) (file.length() * 1)];inputFile.read(buffer);//文件解析把字节数添加到buffer[]中inputFile.close();int viceLength = 180; //每个字节包大小int viceNumber = (int) Math.ceil(buffer.length /(double) viceLength);//存多少个包int from, to;List listrk = new ArrayList();for (int i=0;i<viceNumber;i++){ //将完整音频buffer[]进行循环拆分from=(int) (i*viceLength);to=(int)(from+viceLength);if(to>buffer.length)to=buffer.length;listrk.add(Arrays.copyOfRange(buffer,from,to));//按字节范围拷贝生成新数组,添加到List列表中}redisTemplate.opsForList().rightPushAll("Audio", listrk);//redisTemplate的批量添加,以List列表形式进行存储return "redis入库成功!";}

redis客户端存储结果:
可以看出只存储了一个key,value是以list列表形式存储,音频文件以180个字节数组进行存储,一共存储了2634个。此处没有设缓存时间,所以不会超时。
效果

6.从Redis数据库缓存中获取音频数据进行解析

通过Redis对象的redisTemplate.opsForList().range方法获取缓存的value,通过list集合接收进行遍历,进行合并生成一个新的byte数组,在通过OutputStream对象输出byte数组,浏览器自动解析二进制音频流文件。

/*** 从redis中分包取值进行byte[]数组合并解析音频*/@RequestMapping("/getkeyAudio")public Object getKey(HttpServletResponse response) throws Exception{OutputStream os = response.getOutputStream();List list =redisTemplate.opsForList().range("Audio", 0, -1); //通过key获取指定区间的值,List方式存储用List集合去接收//合并音频List<byte[]> blist = list;int lengthTotal = 0;for (byte[] item : blist) {lengthTotal += item.length;}byte[] totalByte = new byte[lengthTotal];int begin = 0;for (byte[] item : blist) {//System.arraycopy(原数组, 原数组起始位置, 目标数组, 目标数组起始位置, 复制长度);System.arraycopy(item, 0, totalByte, begin, item.length);begin += item.length;}os.write(totalByte);//通过OutputStream对象输出合并后的数组return ""; //OutputStream对象输出流,直接返回为空,浏览器自动会为我们解析音频流}

第一种解析方法:
浏览器发起请求得到音频二进制流,浏览器解析自动生成一个播放器播放该音频及附加下载功能。
效果
第二种解析方法:
在HTML页面中定义Audio标签,创建XMLHttpRequest对象发起请求,通过Audio标签进行解析。

<audio id="sound" width="200" controls="controls"></audio><script>$(document).ready(function(){agf();});function agf() {//创建XMLHttpRequest对象var xhr = new XMLHttpRequest();//配置请求方式、请求地址以及是否同步xhr.open('POST', '/getkey', true);xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");//设置请求结果类型为blobxhr.responseType = 'blob';//请求成功回调函数xhr.onload = function(e) {if (this.status == 200) {//请求成功//获取blob对象var blob = this.response;//获取blob对象地址,并把值赋给容器$("#sound").attr("src", URL.createObjectURL(blob));}};xhr.send();  }
</script>

效果

个人总结: 记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

这篇关于将音频文件转二进制分包存储到Redis(奇淫技巧操作)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/647886

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api