【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编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放