[java 音频处理篇]第1章

前言:

一个小实例先感受一下,怎样就可以播放一个音频文件

正文:

先上代码,大家先赋值下面代码,然后将自己电脑上的wav文件的路径替换到【1】处

package my;

import javax.sound.sampled.*;
import java.io.File;
import java.util.Scanner;

public class Player{
    private static int consoleInput=-1;
    private static final int EXIT = 0;
    public static void main(String[] args) throws Exception {
        /**
         * 这个线程主要用来接收控制台输入退出命令【输入0】,跳出while循环,结束程序。。
         */
        new Thread(()->{
            Scanner scanner = new Scanner(System.in);
            while (true){
                if(scanner.nextInt()==0){
                    consoleInput = 0;
                    break;
                }
            }
        }).start();

        Player player = new Player();
        Clip clip = player.loadSound();
        player.playSound(clip);
    }

    public Clip loadSound() throws Exception {
         //【1】
        String filePath = "C:\\Users\\cook\\Desktop\\javasounddemo-150249\\JavaSoundDemo\\audio\\1-welcome.wav";
        File file = new File(filePath);

        AudioInputStream stream = AudioSystem.getAudioInputStream(file);
        AudioFormat format = stream.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), ((int) stream.getFrameLength() * format.getFrameSize()));

        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.addLineListener((event)->{
            System.out.println(event.getType().toString());
        });

        clip.open(stream);
        return clip;
    }

    public void playSound(Clip clip ){
        clip.start();
        //clip。start开始播放后,要通过一个循环保证程序不执行clip。stop,
        while (true) {
            try {
                if(consoleInput == EXIT){
                    break;
                }
                System.out.println("运行中............");
                Thread.sleep(1000);
            } catch (Exception e) {break;}
        }
        clip.stop();
        clip.close();
        System.out.println("运行结束..........");
    }
}

下面对上面的主要代码用截图分部分进行说明:

 java I/O基础中讲过,要操作一个文件就必须先拿到这个文件的流,语音处理也同理。上图中的AudioInputStream就是我们要听的音频的流信息,这样就有了数据源(相当于你现在有了黑胶唱片),但此时还不能播放,需要放到特定的播放他的工具中才行(唱片机)。

我们知道在计算机中播放声音是通过声卡将数字信号转成模拟信号,然后顺着耳机就能听到了,所以需要把我们的数据源先放进声卡用于处理数字信号的一个管子中,所以我们必须先通过代码创造出这么一个管子,连接到声卡上才行,这个管子也就是图中DataLine

[java 音频处理篇]第1章_第1张图片

 Clip中文意思是剪辑,可以理解为跟DataLine是同一个性质的管子,因为Clip是子类,Clip是一种预加载数据流的管子,就是说如果你有一个音频文件的完整流,你就可以把他放到Clip里去,这样的好处是,因为是预先加载的,就可以知道其长度,因此可以设置在其音频数据的任何位置开始播放(start方法)和停止播放(stop方法)。 也可以创建一个循环,以便在播放片段时重复循环。循环由开始和结束采样帧以及循环应播放的次数指定。而他的父类DataLine做不到这点,他只能实时播放,放完就没了(想象一下流出去的水,就回不到水管中了)。

[java 音频处理篇]第1章_第2张图片 上图就是一个Clip的图(为了便于理解,但不一定百分百准确),我们的wav文件变成流后放到Clip中,然后控制这个箭头,他放到什么位置就可以从这个位置播放了。默认是从头播放。

要用Clip播放音频,首先要做的就是把音频文件的流信息放到Clip中,这就需要使用clip.open方然后才能进行后续的播放,循环,暂停等操作。

当执行完clip.open(stream)后,你就看到,clip中多了音频流的字节数据(下图中的audioData),播放时就是用的这些字节数据(也就是采样数据),如下图:

clip中有了wav文件的音频流后,就可以通过start方法就可以把Clip中的数据不断的交给声卡来处理标称模拟信号,然后我们的耳机就能听到我们的wav音频了。

到此,一个简答的播放wav音频文件的播放过程就完成了。

你可能感兴趣的:(java,java,音视频,jvm)