【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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2