【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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

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

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

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS