4月14日个人博客

1.昨日完成了将MP3文件转换为pcm格式

2.难点:语音转文字只能对pcm,wav等格式,需要进行格式转换

3.今日完成长文件的剪切

4.

package org.example;

import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;

import javax.sound.sampled.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class ConvertMP32PCM {

    /**
     * MP3转换PCM文件方法
     *
     * @param mp3filepath
     *            原始文件路径
     *            转换文件的保存路径
     * @throws Exception
     */
//    public static void convertMP32PCM(String mp3filepath, String pcmfilepath) throws Exception {
//        AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
//        AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath));
//    }

    public static String convertMP32PCM(String mp3filepath) throws Exception {
        AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
        String pcmfilepath = mp3filepath.substring(0,mp3filepath.length()-3) +"pcm";
        AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath));
        return pcmfilepath;
    }

    /**
     * 播放MP3方法
     *
     * @param mp3filepath
     * @throws Exception
     */
    public static void playMP3(String mp3filepath) throws Exception {
        File mp3 = new File(mp3filepath);

        // 播放
        int k = 0, length = 8192;
        AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
        if (audioInputStream == null)
            System.out.println("null audiostream");
        AudioFormat targetFormat;
        targetFormat = audioInputStream.getFormat();
        byte[] data = new byte[length];
        DataLine.Info dinfo = new DataLine.Info(SourceDataLine.class, targetFormat);
        SourceDataLine line = null;
        try {

            line = (SourceDataLine) AudioSystem.getLine(dinfo);
            line.open(targetFormat);
            line.start();

            int bytesRead = 0;
            byte[] buffer = new byte[length];
            while ((bytesRead = audioInputStream.read(buffer, 0, length)) != -1) {
                line.write(buffer, 0, bytesRead);
            }
            audioInputStream.close();

            line.stop();
            line.close();

        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("audio problem " + ex);

        }
    }

    private static AudioInputStream getPcmAudioInputStream(String mp3filepath) {
        File mp3 = new File(mp3filepath);
        AudioInputStream audioInputStream = null;
        AudioFormat targetFormat = null;
        try {
            AudioInputStream in = null;
            MpegAudioFileReader mp = new MpegAudioFileReader();
            in = mp.getAudioInputStream(mp3);
            AudioFormat baseFormat = in.getFormat();
            targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
                    baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
            audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return audioInputStream;
    }

    public static void mp3Convertpcm(String mp3filepath,String pcmfilepath) throws Exception{
        File mp3 = new File(mp3filepath);
        File pcm = new File(pcmfilepath);
        //原MP3文件转AudioInputStream
        AudioInputStream mp3audioStream = AudioSystem.getAudioInputStream(mp3);
        //将AudioInputStream MP3文件 转换为PCM AudioInputStream
        AudioInputStream pcmaudioStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, mp3audioStream);
        //准备转换的流输出到OutputStream
        OutputStream os = new FileOutputStream(pcm);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        while ((bytesRead=pcmaudioStream.read(buffer, 0, 8192))!=-1) {
            os.write(buffer, 0, bytesRead);
        }
        os.close();
        pcmaudioStream.close();
    }


    public static void main(String[] args) {
        String mp3filepath = "D:\\mp3\\1.mp3";
        String pcmfilepath = "D:\\mp3\\1.pcm";

        try {
//            ConvertMP32PCM.convertMP32PCM(mp3filepath, pcmfilepath);
//            ConvertMP32PCM.playMP3(mp3filepath);
            mp3Convertpcm(mp3filepath,pcmfilepath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}















/*

    // 预先设置一个变量来存MediaRecorder实例
    let mediaRecorder = null;
    // 首先打开麦克风
    function record() {
        navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
                let chunks = [];
        mediaRecorder = new MediaRecorder(stream);
        mediaRecorder.start();
        // 录音开始事件监听(即调用 mediaRecorder.start()时会触发该事件)
        mediaRecorder.onstart = () => {
            console.log("record start");


        };

        // 录音可用事件监听,发生于mediaRecorder.stop()调用后,mediaRecorder.onstop 前
        mediaRecorder.ondataavailable = (e) => {
            console.log("dataavailable");
            console.log(e);
            chunks.push(e.data);
        };

        // 录音结束事件监听,发生在mediaRecorder.stop()和 mediaRecorder.ondataavailable 调用后
        mediaRecorder.onstop = () => {
            console.log("record end");
            // 获取到录音的blob
            let blob = new Blob(chunks, { type: "audio/webm;codecs=opus" });
            console.log("🚀 ~ file: record.js:27 ~ navigator.mediaDevices.getUserMedia ~ blob:", blob);

            //   var saveDatas = getDataFromLocal("results");
            //   // 上面是拿到我自己的数据,数据的格式是Json字符串
            //   var newBlob = new Blob([JSON.stringify(saveDatas)], { type: "application/json" });

            // 创建一个blob的对象,把Json转化为字符串作为我们的值
            let url = window.URL.createObjectURL(blob);
            // 上面这个是创建一个blob的对象连链接,
            // 然后创建一个链接元素,是属于 a 标签的链接元素,所以括号里才是a,
            let link = document.createElement("a");
            link.href = url;



            // 把上面获得的blob的对象链接赋值给新创建的这个 a 链接
            link.setAttribute("download", "录音.wav");
            // 设置下载的属性(所以使用的是download),这个是a 标签的一个属性
            // 后面的是文件名字,可以更改
            link.click();
            // 使用js点击这个链接

            //  将blob转换为file对象,名字可以自己改,一般用于需要将文件上传到后台的情况
            // let file = new window.File([blob], "record.webm");

            // 将blob转换为地址,一般用于页面上面的回显,这个url可以直接被 audio 标签使用
            // let url = (window.URL || webkitURL).createObjectURL(blob);
        };
    });
    }
    // 录音结束事件,在需要结束录音时调用,录音结束后的操作请在 mediaRecorder.onstop 里面写
    function stopRecord() {
        mediaRecorder && mediaRecorder.stop();
    }
    function showLocale(objD) {
        var str, colorhead, colorfoot;
        var yy = objD.getYear();
        if (yy < 1900)
            yy = yy + 1900;
        var MM = objD.getMonth() + 1;
        if (MM < 10)
            MM = '0' + MM;
        var dd = objD.getDate();
        if (dd < 10)
            dd = '0' + dd;
        var hh = objD.getHours();
        if (hh < 10)
            hh = '0' + hh;
        var mm = objD.getMinutes();
        if (mm < 10)
            mm = '0' + mm;
        var ss = objD.getSeconds();
        if (ss < 10)
            ss = '0' + ss;
        var ww = objD.getDay();
        colorhead = "<font color=\"#000000\">";
        if (ww == 0)
            ww = "星期日";
        if (ww == 1)
            ww = "星期一";
        if (ww == 2)
            ww = "星期二";
        if (ww == 3)
            ww = "星期三";
        if (ww == 4)
            ww = "星期四";
        if (ww == 5)
            ww = "星期五";
        if (ww == 6)
            ww = "星期六";
        colorfoot = "</font>"
        str = colorhead + yy + "-" + MM + "-" + dd + " " + hh + ":" + mm
                + ":" + ss + "  " + ww + colorfoot;
        return (str);
    }

    function tick() {
        var today;
        today = new Date();
        document.getElementById("localtime").innerHTML = showLocale(today);
        window.setTimeout("tick()", 1000);
    }
window.onload = function() {
        tick();
        }
        function showTab(tabHeadId,tabContentId)
        {

        var tabDiv = document.getElementById("tabDiv");
        var taContents = tabDiv.childNodes;
        for(i=0; i<taContents.length; i++)
        {

        if(taContents[i].id!=null && taContents[i].id != 'tabsHead')
        {
        taContents[i].style.display = 'none';
        }
        }
        document.getElementById('tabContent1').style.display='none';
        document.getElementById('tabContent2').style.display='none';


        document.getElementById(tabContentId).style.display = 'block';

        var tabHeads = document.getElementById('tabsHead').getElementsByTagName('a');
        for(i=0; i<tabHeads.length; i++)
        {

        tabHeads[i].className='tabs';
        }

        document.getElementById(tabHeadId).className='curtab';
        document.getElementById(tabHeadId).blur();
        }
        var audio_context;

        var recorder;

        function start(button) {

        navigator.mediaDevices.getUserMedia({ audio: true }).then(function (stream) {

        var input = new AudioContext().createMediaStreamSource(stream);

        recorder = new Recorder(input);

        recorder.record();

        });

        button.disabled = true;

        button.nextElementSibling.disabled = false;

        }

        function stop(button) {

        recorder && recorder.stop();

        button.disabled = true;

        button.previousElementSibling.disabled = false;

        createDownloadLink();

        recorder.clear();
        }


*/

  

posted @ 2023-04-14 23:18  wrf12  阅读(58)  评论(0)    收藏  举报