【Java学习】将几首歌拼接成一首连续播放的大合唱(20)

2023-11-02 17:31

本文主要是介绍【Java学习】将几首歌拼接成一首连续播放的大合唱(20),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以任意字节切割mp3歌之后再拼接成完整的

  • 案例1:
    • 方法1
    • 方法2
  • 案例2
    • 将多首歌拼接成一首大合唱,优化代码

对一首歌或者多首歌按照1Mb进行切割保存,然后再将切割后的碎片拼接成一首的完整的歌,可以拼接多首歌.来个几十兆的大合唱.

案例1:

对一首歌按照1Mb进行切割保存,然后再将切割后的碎片拼接成一首的完整的歌
将g:\夜夜夜夜.mp3
切开存储g:\apartFile文件夹中
再访问文件夹拼接完整.

方法1

用随机访问流RandomAccessFile,可以控制文件指针
顺序流SequenceInputStream 拼接,可以传一个Enumeration迭代器

package com.westos.afternoon;import java.io.*;
import java.util.Enumeration;
import java.util.Vector;public class Demo5 {public static void main(String[] args) throws IOException {//用随机访问流,可以控制文件指针RandomAccessFile in = new RandomAccessFile(new File("g:\\夜夜夜夜.mp3"), "rw");byte[] bytes = new byte[1024];takeApart(in, bytes);//拆分mergingMusic(bytes);//合并}private static void takeApart(RandomAccessFile in, byte[] bytes) throws IOException {//我的这首歌是4.6兆左右,按照一兆一切可以切5份File file = new File("g:\\apartFile");if(!file.exists()){file.mkdirs();}for (int i = 1; i < 6; i++) {//切开生成5个FileOutputStream out = new FileOutputStream("g:\\apartFile\\apart" + i + ".mp3");int len = 0;while (in.getFilePointer() < 1024*1024 * (i) && (len = in.read(bytes)) != -1) {out.write(bytes, 0, len);out.flush();//System.out.println(in.getFilePointer());}}}private static void mergingMusic(byte[] bytes) throws IOException {Vector<FileInputStream> vector = new Vector<>();File file = new File("g:\\apartFile");File[] files = file.listFiles();for (File f : files) {vector.add(new FileInputStream(f));}Enumeration<FileInputStream> elements = vector.elements();//顺序流SequenceInputStream可以传一个Enumeration迭代器SequenceInputStream sq = new SequenceInputStream(elements);FileOutputStream copy = new FileOutputStream("g:\\apartFile\\夜夜夜夜.mp3",true);int len = 0;byte[] bytes1 = new byte[1024];while ((len = sq.read(bytes)) != -1) {copy.write(bytes, 0, len);}copy.close();sq.close();}}

方法2

用字节缓冲区,一次缓冲1Mb存1Mb

package org.westos.demo2;import java.io.*;
import java.util.Vector;/*** @Author: Administrator* @CreateTime: 2019-01-18 15:17* @Description todo*/
public class MyTest5 {public static void main(String[] args) throws IOException {chaifen(); //拆分文件hebing();//合并文件}private static void hebing() throws IOException {File file1 = new File("g:\\music");File[] files = file1.listFiles();Vector<FileInputStream> v = new Vector<>();for (File f : files) {if (f.isFile() && f.getName().endsWith(".mp3")) {FileInputStream in = new FileInputStream(f);v.add(in);}}SequenceInputStream sin = new SequenceInputStream(v.elements());byte[] bytes = new byte[1024 * 1024];int len = 0;FileOutputStream out = new FileOutputStream("g:\\music\\夜夜夜夜-齐秦.mp3");while ((len = sin.read(bytes)) != -1) {out.write(bytes, 0, len);out.flush();}sin.close();out.close();}private static void chaifen() throws IOException {File file = new File("夜夜夜夜.mp3");//2.封装一个文件夹File file1 = new File("g:\\music");if (!file1.exists()) {file1.mkdirs();}FileInputStream in = new FileInputStream(file);//拆分文件byte[] bytes = new byte[1024 * 1024];//一次取出1Mb,存1Mbint len = 0;int i = 1;while ((len = in.read(bytes)) != -1) {FileOutputStream out = new FileOutputStream(new File(file1, (i++) + ".mp3"));out.write(bytes, 0, len);out.close();}in.close();}
}


案例2

将多个音乐切割并拼接成一首歌
例如以下三首:
g:\情书.mp3
g:\夜夜夜夜.mp3
g:\怎样.mp3
拼接成g:\Copy.mp3

将多首歌拼接成一首大合唱,优化代码

package com.westos.afternoon;import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Vector;public class Demo5 {public static void main(String[] args) throws IOException {//用随机访问流,可以控制文件指针//常见要合并的歌曲,以下三首RandomAccessFile in = new RandomAccessFile(new File("g:\\情书.mp3"), "rw");RandomAccessFile in1 = new RandomAccessFile(new File("g:\\夜夜夜夜.mp3"), "rw");RandomAccessFile in2 = new RandomAccessFile(new File("g:\\怎样.mp3"), "rw");ArrayList<RandomAccessFile> list = new ArrayList<>();list.add(in);list.add(in1);list.add(in2);for (RandomAccessFile randomAccessFile : list) {takeApart(randomAccessFile);//拆分成10份,每次循环覆盖mergingMusic();//合并这10分}}private static void takeApart(RandomAccessFile in) throws IOException {//我的这首歌是4.6兆左右,按照一兆一切可以切5份,但是我考虑到有的歌大于5兆,就分成10份,相当于可以存10兆之内的歌File file = new File("g:\\apartFile");if(!file.exists()){file.mkdirs();}for (int i = 1; i < 11; i++) {//切开生成5个FileOutputStream out = new FileOutputStream("g:\\apartFile\\apart" + i + ".mp3");int len = 0;byte[] bytes = new byte[1024];while (in.getFilePointer() < 1024*1024 * (i) && (len = in.read(bytes)) != -1) {out.write(bytes, 0, len);out.flush();//System.out.println(in.getFilePointer());}out.close();}}private static void mergingMusic() throws IOException {Vector<FileInputStream> vector = new Vector<>();File file = new File("g:\\apartFile");File[] files = file.listFiles();for (File f : files) {if(f.isFile()&&f.getName().substring(0, 5).equals("apart")){vector.add(new FileInputStream(f));}}Enumeration<FileInputStream> elements = vector.elements();//顺序流SequenceInputStream可以传一个Enumeration迭代器SequenceInputStream sq = new SequenceInputStream(elements);FileOutputStream copy = new FileOutputStream("g:\\Copy.mp3",true);int len = 0;byte[] bytes = new byte[1024];while ((len = sq.read(bytes)) != -1) {copy.write(bytes, 0, len);}copy.close();sq.close();}}

结果:
将一首歌切成10块,每块最大1024kb,每次循环覆盖原有的
在这里插入图片描述
Copy.mp3就是最后结果,将3首歌拼接在了一起.
在这里插入图片描述


谢谢

这篇关于【Java学习】将几首歌拼接成一首连续播放的大合唱(20)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

Spring Boot 常用注解详解与使用最佳实践建议

《SpringBoot常用注解详解与使用最佳实践建议》:本文主要介绍SpringBoot常用注解详解与使用最佳实践建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、核心启动注解1. @SpringBootApplication2. @EnableAutoConfi

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Python与Java交互出现乱码的问题解决

《Python与Java交互出现乱码的问题解决》在现代软件开发中,跨语言系统的集成已经成为日常工作的一部分,特别是当Python和Java之间进行交互时,编码问题往往会成为导致数据传输错误、乱码以及难... 目录背景:为什么会出现乱码问题产生的场景解决方案:确保统一的UTF-8编码完整代码示例总结在现代软件

Java 如何创建和使用ExecutorService

《Java如何创建和使用ExecutorService》ExecutorService是Java中用来管理和执行多线程任务的一种高级工具,可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处... 目录一、什么是ExecutorService?二、ExecutorService的核心功能三、如何创建

springboot实现配置文件关键信息加解密

《springboot实现配置文件关键信息加解密》在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot... 目录前言方案实践1、第一种方案2、第二种方案前言在项目配置文件中常常会配置如数据库连接信息、Red

JavaScript时间戳与时间的转化常用方法

《JavaScript时间戳与时间的转化常用方法》在JavaScript中,时间戳(Timestamp)通常指Unix时间戳,即从1970年1月1日00:00:00UTC到某个时间点经过的毫秒数,下面... 目录1. 获取当前时间戳2. 时间戳 → 时间对象3. 时间戳php → 格式化字符串4. 时间字符

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

Java版本不兼容问题详细解决方案步骤

《Java版本不兼容问题详细解决方案步骤》:本文主要介绍Java版本不兼容问题解决的相关资料,详细分析了问题原因,并提供了解决方案,包括统一JDK版本、修改项目配置和清理旧版本残留等步骤,需要的朋... 目录错误原因分析解决方案步骤第一步:统一 JDK 版本第二步:修改项目配置第三步:清理旧版本残留兼容性对