保存wave音频流的方法

保存到文件:

void saveToFile(String filename, ByteBuffer buffer)
    {
        byte[] bytes = buffer.array();
        OutputStream outStream = null;
        try {
            File file = new File(filename);
            String directory = file.getParent();
            if(Files.notExists(Paths.get(directory)))
            {
                Files.createDirectories(Paths.get(directory));
            }
            //TODO:改成nio FileChannel
            outStream = new FileOutputStream(file);

            /**
             * 8 bit Unsigned
             * 16 bit Signed 16000 16
             */
            //TODO:改成直接操作二进制的代码 StdWavFile:signed 16bit pcm le wav
            WaveFileWriter writer = new WaveFileWriter();
            AudioFormat frmt = new AudioFormat(16000, 16, 1, true, false);
            ByteArrayInputStream bi = new ByteArrayInputStream(bytes);

            InputStream in = new AudioInputStream(bi, frmt,bytes.length);
            writer.write((AudioInputStream) in, AudioFileFormat.Type.WAVE, outStream);
            outStream.close();
        } catch (Exception e) {
            getLogger().error("文件保存失败:{}",e);
        }
    }

其他方法:

/***
     * 将pcm音频流封装成wave音频流
     * @param rawData 音频流
     * @param sampleRate 采样率
     * @return
     * @throws IOException
     */
    private byte[] rawToWave(final byte[] rawData, int sampleRate) throws IOException {
        DataOutputStream output = null;
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            output = new DataOutputStream(outputStream);
            // WAVE header
            // see http://ccrma.stanford.edu/courses/422/projects/WaveFormat/
            writeString(output, "RIFF"); // chunk id
            writeInt(output, 36 + rawData.length); // chunk size
            writeString(output, "WAVE"); // format
            writeString(output, "fmt "); // subchunk 1 id
            writeInt(output, 16); // subchunk 1 size
            writeShort(output, (short) 1); // audio format (1 = PCM)
            writeShort(output, (short) 1); // number of channels
            writeInt(output, sampleRate); // sample rate
            writeInt(output, sampleRate * 2); // byte rate
            writeShort(output, (short) 2); // block align
            writeShort(output, (short) 16); // bits per sample
            writeString(output, "data"); // subchunk 2 id
            writeInt(output, rawData.length); // subchunk 2 size
            // Audio data (conversion big endian -> little endian)
            short[] shorts = new short[rawData.length / 2];
            ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
            ByteBuffer bytes = ByteBuffer.allocate(shorts.length * 2);
            for (short s : shorts) {
                bytes.putShort(s);
            }

            output.write(rawData);
            return outputStream.toByteArray();
        } finally {
            if (output != null) {
                output.close();
            }
        }
    }

    /***
     * 将pcm音频流封装成wave音频文件
     * @param rawData 原始音频
     * @param sampleRate 采样率
     * @param waveFile wave声音文件
     * @throws IOException
     */
    private void rawToWave(final byte[] rawData, int sampleRate,final File waveFile) throws IOException {
        DataOutputStream output = null;
        try {
            output = new DataOutputStream(new FileOutputStream(waveFile));
            // WAVE header
            // see http://ccrma.stanford.edu/courses/422/projects/WaveFormat/
            writeString(output, "RIFF"); // chunk id
            writeInt(output, 36 + rawData.length); // chunk size
            writeString(output, "WAVE"); // format
            writeString(output, "fmt "); // subchunk 1 id
            writeInt(output, 16); // subchunk 1 size
            writeShort(output, (short) 1); // audio format (1 = PCM)
            writeShort(output, (short) 1); // number of channels
            writeInt(output, sampleRate); // sample rate
            writeInt(output, sampleRate * 2); // byte rate
            writeShort(output, (short) 2); // block align
            writeShort(output, (short) 16); // bits per sample
            writeString(output, "data"); // subchunk 2 id
            writeInt(output, rawData.length); // subchunk 2 size
            // Audio data (conversion big endian -> little endian)
            short[] shorts = new short[rawData.length / 2];
            ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
            ByteBuffer bytes = ByteBuffer.allocate(shorts.length * 2);
            for (short s : shorts) {
                bytes.putShort(s);
            }

            output.write(rawData);
        } finally {
            if (output != null) {
                output.close();
            }
        }
    }

    /***
     * 将pcm音频文件封装成wave文件
     * @param rawFile pcm音频数据文件
     * @param sampleRate 采样率
     * @param waveFile wave文件
     * @throws IOException
     */
    private void rawToWave(final File rawFile, int sampleRate,final File waveFile) throws IOException {

        byte[] rawData = new byte[(int) rawFile.length()];
        DataInputStream input = null;
        try {
            input = new DataInputStream(new FileInputStream(rawFile));
            input.read(rawData);
        } finally {
            if (input != null) {
                input.close();
            }
        }

        DataOutputStream output = null;
        try {
            output = new DataOutputStream(new FileOutputStream(waveFile));
            // WAVE header
            // see http://ccrma.stanford.edu/courses/422/projects/WaveFormat/
            writeString(output, "RIFF"); // chunk id
            writeInt(output, 36 + rawData.length); // chunk size
            writeString(output, "WAVE"); // format
            writeString(output, "fmt "); // subchunk 1 id
            writeInt(output, 16); // subchunk 1 size
            writeShort(output, (short) 1); // audio format (1 = PCM)
            writeShort(output, (short) 1); // number of channels
            writeInt(output, sampleRate); // sample rate
            writeInt(output, sampleRate * 2); // byte rate
            writeShort(output, (short) 2); // block align
            writeShort(output, (short) 16); // bits per sample
            writeString(output, "data"); // subchunk 2 id
            writeInt(output, rawData.length); // subchunk 2 size
            // Audio data (conversion big endian -> little endian)
            short[] shorts = new short[rawData.length / 2];
            ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
            ByteBuffer bytes = ByteBuffer.allocate(shorts.length * 2);
            for (short s : shorts) {
                bytes.putShort(s);
            }

            output.write(fullyReadFileToBytes(rawFile));
        } finally {
            if (output != null) {
                output.close();
            }
        }
    }

    byte[] fullyReadFileToBytes(File f) throws IOException {
        int size = (int) f.length();
        byte bytes[] = new byte[size];
        byte tmpBuff[] = new byte[size];
        FileInputStream fis= new FileInputStream(f);
        try {

            int read = fis.read(bytes, 0, size);
            if (read < size) {
                int remain = size - read;
                while (remain > 0) {
                    read = fis.read(tmpBuff, 0, remain);
                    System.arraycopy(tmpBuff, 0, bytes, size - remain, read);
                    remain -= read;
                }
            }
        }  catch (IOException e){
            throw e;
        } finally {
            fis.close();
        }

        return bytes;
    }
    private void writeInt(final DataOutputStream output, final int value) throws IOException {
        output.write(value >> 0);
        output.write(value >> 8);
        output.write(value >> 16);
        output.write(value >> 24);
    }

    private void writeShort(final DataOutputStream output, final short value) throws IOException {
        output.write(value >> 0);
        output.write(value >> 8);
    }

    private void writeString(final DataOutputStream output, final String value) throws IOException {
        for (int i = 0; i < value.length(); i++) {
            output.write(value.charAt(i));
        }
    }

代码来源:https://stackoverflow.com/questions/37281430/how-to-convert-pcm-file-to-wav-or-mp3

原文地址:https://www.cnblogs.com/passedbylove/p/11840266.html

时间: 2024-11-06 15:43:06

保存wave音频流的方法的相关文章

php实现上传图片保存到数据库的方法

http://www.jb51.net/article/61034.htm 作者:傲雪星枫 字体:[增加 减小] 类型:转载 这篇文章主要介绍了php实现上传图片保存到数据库的方法,可通过将图片保存在数据库实现多台服务器共享文件的功能,非常具有实用价值,需要的朋友可以参考下 php实现上传图片保存到数据库的方法.分享给大家供大家参考.具体分析如下: php 上传图片,一般都使用move_uploaded_file方法保存在服务器上.但如果一个网站有多台服务器,就需要把图片发布到所有的服务器上才能

ASP.NET下载远程图片保存到本地的方法、保存抓取远程图片

ASP.NET下载远程图片保存到本地的方法.保存抓取远程图片 2012-05-16 11:25:51     我来说两句      收藏    我要投稿 以下介绍两种方法:1.利用WebRequest,WebResponse 类WebRequest wreq=WebRequest.Create("http://up.2cto.com/2012/0516/20120516112717995.gif");    HttpWebResponse wresp=(HttpWebResponse)

delphi开发实例:保存字体设置的方法

http://blog.csdn.net/delphi308/article/details/9906147 delphi开发实例:保存字体设置的方法 2013-08-11 22:37 446人阅读 评论(0) 收藏 举报  分类: Delphi(59)  记得一年前软件里面用到字体设置时,想把字体信息保存到配置文件里面都是把相应的属性分开来保存一下,这样一直使用,最近想delphi自己的dfm文件也同样会保存这些信息,它又是怎样保存的呢.. 用记事本打开dfm文件会看到类似这样的文本: obj

php使用cookie保存登录用户名的方法

php使用cookie保存登录用户名的方法 2015-01-26 11:03:13  www.hackbase.com  来源:互联网 提交表单页面复制代码代码如下:<?php$user = isset($_COOKIE['username'])?$_COOKIE['username']:'';?><form action="file.php" method="post">用户名:<input type="text"

ios 保存本地数据的方法

1. NSString *path = [[NSBundle mainBundle] pathForResource:@"文件名" ofType:@"plist"]; // 文件数据类型是array NSArray *array=[NSArray arrayWithContentsOfFile:path]; //文件数据类型是*dictionary NSDictionary *dictionary = [NSDictionary dictionaryWithCont

IOS持久化数据----(保存数据的一系列方法

数据持久存储到IOS文件系统中有三种不同的机制:属性列表,对象归档,嵌入式数据库SQLite3(另外还有其他方法,可以用传统的C IO函数读取或者写入数据,也可以使用Cocoa的低级文件管理工具) 每一个应用程序支持三个文件夹 Documents, Library 和 tmp.应用程序将其数据存储在Documents中,(但基于NSUserDefaults的首选设置除外,它存储在Library/Preferences文件夹中),当ios设备同步时,不会去备份/tmp中的文件. 1. 下面这句话将

Android学习笔记-保存数据的实现方法1

Android开发中,有时候我们需要对信息进行保存,那么今天就来介绍一下,保存文件到内存,以及SD卡的一些操作,及方法,供参考. 第一种,保存数据到内存中: //java开发中的保存数据的方式 public static boolean saveUserInfo(String username,String password){ File file = new File("/data/data/com.ftf.login/info.txt"); try { FileOutputStre

Matlab中图片保存的5种方法

matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的. Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工具箱也提供了专业绘图函数,这些值得大家深入学习好久. 今天我只是讨论下如何保存这些由Matlab绘制出来的图像呢?当然借助第三方截图软件,就算了! 1.使用imwrite 函数 如图像是img,则可以使用 imwrite(img,'result.jpg'); 这种方法保存图像大小和显示的大小事一样的.

php如何将数组保存为文件的方法? 三个方法让你快速把数组保存成为文件存储

php 缓存数组形式的变量,实际上就是将 php 将数组写入到一个文本文件或者后缀名为 .php 存储起来,使用的时候直接调用这个文件.那么如何使用 php 将数组保存为文本格式的文件呢?下面分享三种方法实现将 php 数组写入到文件以缓存数组. (1)利用php的序列化函数 serialize 和反序列化函数unserialize可以将数组序列化存储为文本文件,然后再反序列化做为数组取出. PHP Code复制内容到剪贴板 <?php $file='./cache/phone.php'; $a