FTP下载过程中对V3格式文件进行转换 10C

ftp下载文件过程中,对v3格式文件进行转换,转成wav格式,并返回给页面,下载和播放。
怎么实现。网上的本地转换代码确实可用,但是我对字节流、转码这一块不太懂,不知道有
没有大神来看看,怎么写?
下面是本地v3转wav的代码

 package cn.sh.ideal.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


    public class V3ToWav {
        private static V3ToWav v3ToWav;
        private V3ToWav(){

        }

        public static V3ToWav getInstance(){
            if(v3ToWav == null){
                v3ToWav = new V3ToWav();
            }
            return v3ToWav;
        }

        private static final int WAV_HEAD = 36;// wav文件头长度

        private static final int VF_ADPCM = 1;// 编码格式

        private static final int BIT_RATE_VB_8 = 1;// 每个样本位数

        private static final int BIT_RATE_VB_16 = 2;// 每个样本位数

        private static final int RESET_VALUE = 48;

        private static byte out_val;

        /**
         * 
         * @param inFile
         * @param outFile
         * @param voxFormat
         *            格式 取值范围:VF_ADPCM = 1, VF_MULAW = 2, VF_ALAW = 3
         * @param voxRate
         *            采样率 取值范围:VR_6K = 6000, VR_8K = 8000
         * @param bit_rate
         *            位数 取值范围:VB_8 = 1, VB_16 = 2
         * @return
         */

        public static void voxConvert(String inFile, String outFile, int voxFormat,
                int voxRate, int bit_rate) throws Exception {

            if (outFile == null) {
                outFile = inFile.substring(0, inFile.length() - 2);
                outFile = outFile + "wav";
            }

            File outF = new File(outFile);
            File inF = new File(inFile);

            long inFileSize = inF.length();
            if (voxFormat == VF_ADPCM) { // if using ADPCM input format...
                inFileSize = inFileSize * 2;
            }// change from bytes to samples

            FileOutputStream filewriter = new FileOutputStream(outF, false);
            String wavBegin = "RIFF";
            filewriter.write(wavBegin.getBytes());// WAV 文件头

            long wavLength = inFileSize * bit_rate + WAV_HEAD;
            byte[] tmpArr = new byte[4];
            longToIntBinary(wavLength, tmpArr, 0);
            filewriter.write(tmpArr);// 文件总长度

            String wavTag = "WAVEfmt ";
            filewriter.write(wavTag.getBytes());// WAV 文件标识

            int headLength = 16;
            tmpArr = new byte[4];
            longToIntBinary(headLength, tmpArr, 0);
            filewriter.write(tmpArr);// size of .WAV file header

            int wFormatTag = 1; // format tag (01 = Windows PCM)
            tmpArr = new byte[2];
            toShortBinary(wFormatTag, tmpArr, 0);
            filewriter.write(tmpArr);// format tag (01 = Windows PCM)

            int nChannels = 1; // channels (1=mono, 2=stereo)
            tmpArr = new byte[2];
            toShortBinary(nChannels, tmpArr, 0);
            filewriter.write(tmpArr);// channels (1=mono, 2=stereo)

            int nSamplesPerSec = voxRate; // samples per second
            tmpArr = new byte[4];
            longToIntBinary(nSamplesPerSec, tmpArr, 0);
            filewriter.write(tmpArr);

            int nAvgBytesPerSec = voxRate * bit_rate; // bytes per second
            // during play
            tmpArr = new byte[4];
            longToIntBinary(nAvgBytesPerSec, tmpArr, 0);
            filewriter.write(tmpArr);

            int nBlockAlign = bit_rate; // bytes per sample
            tmpArr = new byte[2];
            toShortBinary(nBlockAlign, tmpArr, 0);
            filewriter.write(tmpArr);// bytes per sample

            int wBitsPerSample = 8 * bit_rate; // bits per sample
            tmpArr = new byte[2];
            toShortBinary(wBitsPerSample, tmpArr, 0);
            filewriter.write(tmpArr);// bits per sample

            /** ******以下是数据头********* */
            String dataTag = "data";
            filewriter.write(dataTag.getBytes());// data tag

            long Datalen = inFileSize * bit_rate; // write size of .WAV data
            // portion
            tmpArr = new byte[4];
            longToIntBinary(Datalen, tmpArr, 0);
            filewriter.write(tmpArr);// 数据总长度

            //FileInputStream fileReader = new FileInputStream(inF);
            FileInputStream fileReader = new FileInputStream(inF);
            byte[] outbytebuffer = new byte[20000];
            int[] outintbuffer = new int[20000];
            switch (voxFormat) {
            case VF_ADPCM:// VF_ADPCM
            {
                short Sn = 0; // initialize the ADPCM variables
                int SS = 16; // initialize the Step
                int SSindex = 1;
                int i = 0;
                byte[] b = new byte[10000];

                int outindex;
                byte sample;// 一个采样样本

                int allBytes = fileReader.available();
                while (allBytes > 0) {
                    int thisRead = allBytes > 10000 ? 10000 : allBytes;
                    int bytes = fileReader.read(b, 0, thisRead);

                    allBytes -= thisRead;// 剩余可读的字节数
                    outindex = 0;
                    for (int index = 0; index < bytes; index++) {
                        sample = b[index];
                        byte highByte = (byte) (sample >>> 4 & 0xff);
                        byte lowByte = (byte) (sample & 0x0f);

                        /** *****开始高字节处理******** */
                        if ((highByte == 0) || (highByte == 8)) {
                            i++;
                        }
                        Object[] retVal = decode((byte) (sample >>> 4), Sn, SS,
                                SSindex);
                        Sn = ((Short) retVal[0]).shortValue();
                        SS = ((Integer) retVal[1]).intValue();
                        SSindex = ((Integer) retVal[2]).intValue();

                        int out_int;
                        if (bit_rate == BIT_RATE_VB_8) {// if 8 bits per sample...
                            out_int = Sn / 16;
                            if (out_int > 127) { // clip if above or below WAV
                                // bounds
                                out_int = 127;
                            }
                            if (out_int < -128) {
                                out_int = -128;
                            }
                            out_val = (byte) ((out_int - 128) & 0xff); // convert

                            // to
                            // .WAV format
                            outbytebuffer[outindex] = out_val; // write the output
                            // byte
                        } else {// else 16 bits per sample
                            out_int = Sn * 16; // rescale to 16 bits
                            outintbuffer[outindex] = out_int; // write the output
                            // int
                        }
                        outindex++;

                        if (i == RESET_VALUE) { // Reset ADPCM variables 48位时重置各个值
                            Sn = 0; // initialize the ADPCM variables
                            SS = 16; // initialize the Step
                            i = 0;
                        }

                        /** *******低字节处理********* */
                        if (lowByte == 0 || lowByte == 8) {
                            i++;
                        }
                        retVal = decode((byte) (sample & 0x0f), Sn, SS, SSindex);
                        Sn = ((Short) retVal[0]).shortValue();
                        SS = ((Integer) retVal[1]).intValue();
                        SSindex = ((Integer) retVal[2]).intValue();

                        if (bit_rate == BIT_RATE_VB_8) {// if 8 bits per sample...
                            out_int = Sn / 16;
                            if (out_int > 127) { // clip if above or below WAV
                                // bounds
                                out_int = 127;
                            }
                            if (out_int < -128) {
                                out_int = -128;
                            }
                            out_val = (byte) ((out_int - 128) & 0xff); // convert

                            // to
                            // .WAV format
                            outbytebuffer[outindex] = out_val; // write the output
                            // byte
                        } else {// else 16 bits per sample
                            out_int = Sn * 16; // rescale to 16 bits
                            outintbuffer[outindex] = out_int; // write the output
                            // int
                        }
                        outindex++;

                        if (i == RESET_VALUE) { // Reset ADPCM variables 48位时重置各个值
                            Sn = 0; // initialize the ADPCM variables
                            SS = 16; // initialize the Step
                            i = 0;
                        }
                    }
                    if (bit_rate == BIT_RATE_VB_8) {
                        filewriter.write(outbytebuffer);

                    } else {
                        for (int j = 0; j < outintbuffer.length; j++) {
                            byte[] arr = new byte[4];
                            longToIntBinary(outintbuffer[j], arr, 0);
                            filewriter.write(arr);

                        }
                    }
                }
                break;

            }
            default:
                break;
            }

            fileReader.close();
            filewriter.close();

        }

        /**
         * 
         * @param sample
         * @param Sn
         * @param ss
         *            引用变量
         * @param SSindex
         *            引用变量
         * @return
         */
        private static Object[] decode(byte sample, short Sn, int SS, int SSindex) {
            Object[] retArr = new Object[3];
            int[] SSadjust = new int[] { -1, -1, -1, -1, 2, 4, 6, 8 };
            // Calculated stepsizes per Dialogic Application Note 1366
            int[] SStable = new int[] { 0, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37,
                    41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143,
                    157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449,
                    494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411,
                    1552 };
            int Mn = 0; // calculate the linear adjustment
            if ((sample & 0x4) != 0) {
                Mn = SS;
            }
            if ((sample & 0x2) != 0) {
                Mn = Mn + (SS >>> 1);
            }// div 2
            if ((sample & 0x1) != 0) {
                Mn = Mn + (SS >>> 2);
            }// div 4

            Mn = Mn + (SS >>> 3); // div 8
            // 取Sample的符号位,即最高位
            if ((sample & 0x8) != 0) { // 最高位为1,则符号位为负
                Sn = (short) (((int) Sn - Mn) & 0xffff); // ...subtract the
                // adjustment
            } else { // 符号位为正
                Sn = (short) (((int) Sn + Mn) & 0xffff); // ...add the adjustment
            }

            if (Sn > 2047) { // adjust if sample too large...
                Sn = 2047;
            }
            if (Sn < -2048) { // ...or too small
                Sn = -2048;
            }

            // use as index into step size adjustment, adjust step size index
            SSindex = SSindex + SSadjust[sample & 0x07];

            if (SSindex < 1) { // keep SSindex within bounds...
                SSindex = 1;
            }
            if (SSindex > 49) {
                SSindex = 49;
            }

            SS = SStable[SSindex]; // get new step size from table

            retArr[0] = Sn;
            retArr[1] = SS;
            retArr[2] = SSindex;
            return retArr;
        }

        /**
         * 整型转数组
         * 
         * @param val
         * @param array
         * @param offset
         */
        private static void longToIntBinary(long val, byte[] array, int offset) {
            array[offset] = (byte) (val & 0xff);
            array[offset + 1] = (byte) (val >>> 8 & 0xff);
            array[offset + 2] = (byte) (val >>> 16 & 0xff);
            array[offset + 3] = (byte) (val >>> 24 & 0xff);
        }

        private void byteToShortBinary(byte val, byte[] array, int offset) {
            array[offset] = (byte) (val & 0xff);
            array[offset + 1] = 0x0;
        }

        /**
         * java中没有有符号类型,所以将超过0x7FFF的short类型保存为int类型。本方法提供了将有符号short类型
         * 转换保存在字节数组中,占据两个字节
         * 
         * @param val
         *            int
         * @param array
         *            byte[]
         * @param offset
         *            int
         */
        private static void toShortBinary(int val, byte[] array, int offset) {
            array[offset] = (byte) (val & 0xff);
            array[offset + 1] = (byte) (val >>> 8 & 0xff);
        }

        public static void main(String[] args) {

            String inFile  = "E:\\HK006470083.V3";
            String outFile = "E:\\test.wav";

            try {
                voxConvert(inFile, outFile, 1, 6000, 1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

1个回答

转换完不正确啊,全是噪音

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
FTP下载过程中的问题
为什么FTP下载过程中的问题经常报10054错误?环境是手机上网,在GPRS网络质量不好的情况下,很容易就出现.这和FTP的主被动模式有关系吗?
FTP下载过程中如何取消下载?
就是一般的FTP软件上的取消钮是怎么实现的?
【修改时间】【转换时间】【ftp下载】
在ftp服务器上下载了文件,并读取了该文件的时间属性,把ftp文件的时间赋给了当地下载了的文件,但是差8个小时,如何使时间一致啊?部分代码如下rnhConnection = InternetConnect(hOpen, ip, 0,username, password, 1, 0, 0)rnbRet = FtpSetCurrentDirectory(hConnection, FtpServerDir)rnpData.cFileName = String(MAX_PATH, 0)rnhFind = FtpFindFirstFile(hConnection, "*.gz", pData, 0, 0)rnmfile = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)rnrnFileHandle = CreateFile("c:\"+mfile, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0) 文件名为mfile已下载在当地"c:\"下rnSetFileTime FileHandle, pData.ftCreationTime, pData.ftLastAccessTime,pData.ftLastWriteTimern如何改代码使修改时间一致,而不相差8小时?rn高手请帮忙啊!
Python对csv格式文件进行数据分析
csv格式文件数据分析1. 下载数据1.1     下载数据,处理csv格式文件的数据安装csv模块,在网上下载或者自己写一个csv格式的文件相关文档请访问https://download.csdn.net/download/qq_37504771/10438857https://download.csdn.net/download/qq_37504771/10438862            ...
请问如何对rtf格式文件进行读写?
请教各位高手,谢谢了
用curl进行ftp下载
用curl的ftp命令,怎么得到ftp站点上的文件列表(文件及文件夹),,然后按目录结构全下载下来?
ipv6下如何进行FTP下载?
手机IPV6rn服务器IPV6rn在同一局域网rnrn如何在服务器上搭建server进行IPV6的下载?rnbusybox ftpget支持IPV6吗?
HL7 V2 到 V3的转换
HL7 V2 到 V3的转换,介绍全面,值得一看
如何对日期进行转换?
字符串“Fri Mar 19 18:01:37 CST 2010”,在oracle中如何将它转换成日期格式?
FFmpeg对音频文件进行转换
比如,应用FFmpeg要把pcm,wav,m4a等转换成mp3文件,或者对音频文件进行互转,不知当如何处理,哪里有相关的例程?还有就是对音频文件进行调速
springmvc对日期格式进行转换
package com.zipx.controller.converters; import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.spri
FTP下载 FTP下载 FTP下载
FTP下载FTP下载FTP下载FTP下载FTP下载FTP下载FTP下载FTP下载
对 MVC 的输入进行转换。。
https://blog.csdn.net/hesi726/article/details/83030415    这儿说了一下不修改数据库也不修改太多代码的情况下将数字加密的问题,(适应于Json) 现在问题来了,客户端传回来的也是加密后的字符串。。。噗通。。 绑定到 int 类型的属性,。 服务器端直接报 Model Validate 出错。。 所以,服务器端还需要一个反转的过程; MVC 有...
PDF格式文件的转换?
如何将受保护的PDF(禁止复制、粘贴、打印等)转换为本TXT文件。
ftp下载过程中,然后显示进度?
就是ftp在下载单个文件 的过程中,如何用进度条或百分比显示进度rnrn用NMFTP或Idftp都可,进度条用progressbarrnrn不胜感激!
pdg格式文件破解转换
pdg格式的电子资料好多格式都是加密了的,本软件可以将许多pdg格式的电子资料转换为pdf等格式。
不同格式文件的转换
.pages文件转成.doc格式的文件 转换地址 https://cloudconvert.com/pages-to-doc 转换地址 https://www.freepdfconvert.com/
批量转换DBF格式文件为CSV格式文件
批量转换DBF格式文件为CSV格式文件
下载对账单&转换短链接
我相信这是你学习微信接口及使用PHP开发微信好的方法,本套课程使用PHP框架yii2开发,当然即便你不了解yii2,只要对PHP熟悉也很容易入门。rnrn做一个微信SDK,在学习微信接口开发上还有比这更好的方法么?
MYDOWN V3下载.......
IT工具 wome888@gmail.com
如何对存储过程中的变量进行类型转换????
/*负债表中未分配利润(管理费用)期初数*/rnif @yue=01rnbeginrnselect @fzglqc1=sum(feiyong) from hqhesuan wherernyear=@nian-1rnand (month<='12')rnset @fzglfyqc=@fzglqc1rnendrnelsernbeginrnselect @fzglqc=sum(feiyong) from hqhesuan rnwhere year=@nianrnand (month<=@yue-1)rnset @fzglfyqc=@fzglqcrnendrn象上面的一段代码中@YUE为字符变量,要进行@yue-1的运算时需要转换成整数,如何做??
存储过程中如何对字符串进行分割?
如题,数据库中有一个字段,其值为12,314,234,2,45,67,这种类型,在存储过程中怎样对这一值按逗号进行分割呢?
存储过程中对字符串进行截取
比如是数据是@str=1,2,3,4这样的能不能进行分解是得到每一个数字?
matlab实现转换音频格式文件,mp3到wav的转换
准备数据 下载的音频文件:开源https://voice.mozilla.org/zh-CN/datasets 问题是该音频文件无扩展名(格式为MP3)如何实现批量在文件后面添加扩展名.mp3? 操作:在当前文件夹下新建txt文件,并加上如下代码:ren *.* *.MP3 如果是将txt转换为MP3则改为ren *.txt* *.MP3 参考:https://www.zhihu.co...
flv格式文件播放器下载
flv格式文件播放器下载(带格式转换)<br>由刘于兵搜藏<br> yubing8882002@yahoo.com.cn
django下载所有格式文件
def download_file(request):     file=open('F://user.xls','rb')     response =StreamingHttpResponse(file)     response['Content-Type']='application/octet-stream'     response['Content-Disposition']='at...
下载的chm格式文件打不开
首先,在微软网站上下载hhupd.exe , 安装 hh.exe 后并运行。然后运行“regsvr32 C:\windows\system\hhopen.ocx”等CHM相关文件。如果还是不能正常打开CHM文档,就看看你的注册表中的 “HKEY_CLASSES_ROOT\chm.file\shell\open\command”分支,如果分支下面除了默认项外,还多了一个“command”字符串,就把
下载flv格式文件的工具
专门下载视频网站的FLV视频,使用简单,傻瓜式操作,功能齐全
pdb格式文件阅读器下载
pdb阅读器,使用PDB快速打开.PDB文件进行浏览,给你学习增加助力,若有不明白的地方,请与我联系给你解答
c#怎样对ftp进行操作啊
比如说登陆rn取得一个目录下的所有文件的信息rnrnrn上传rn
c#这样对ftp进行操作啊
比如说登陆rn取得一个目录下的所有文件的信息rnrnrn上传
FTP过程中的数据回滚
我有一个过程,主要的功能是从FTP上取出文件放在指定目录,然后再把这些文件导入相应的表,过程内容很简单。rn现在出现个情况,在过程执行中我点了“停止”按钮,从进程中显示是是回滚。是停在了FTP下载文件的地方。rn这个回滚根本就回滚不了什么东西,等上很长时间也回滚不完,以前出现过这种情况,我把SQL的服务重启后就可以了。rn现在的问题是问一下除了重启SQL服务还有别的办法。现在的数据库正在被别的进程使用无法重启,求别的解决办法。rn
寻找PDF格式文件的转换工具!!!
各位:rn哪位知道何处有可下载的PDF格式文件的转换工具(如PDF转换为TXT或WORD格式)?rn前几天在一个网站上见到一个PDF转换TXT的文件(Aerial),但无法下载(文件找不到)。rn请通知我,谢谢rn xg_liu0431@sina.com
计算机视觉第六篇:jason格式文件的转换
一、使用labelme标注图像后,会生成json格式的文件。如下图 保存该标注,可以得到一个.json文件。如何打开json格式的文件可以参考这篇文章(https://blog.csdn.net/qq_15969343/article/details/79817354)。json格式的文件需要转换为训练程序需要的Mask数据,才能进行训练。所以激活Anacondalabelme环境 1、...
Python连接ftp,并对FTP进行操作
#!usr/bin/env python # -*- coding:utf-8 -*- # 作用登录连接FTP,当无法连接时,显示错误代码,ftp.connect()和ftp.login() # 可以了解FTP的环境搭建,了解ftp --help 即可 import ftplib import os import socket from ftplib import FTPimport sysrelo
请问用java 进行ftp下载和删除?
用sun.net.ftp.FtpClient类rn我想实现下载ftp服务器上某个文件夹下面的全部文件,并且下载完后删除服务器上的这些文件.rn该如何实现,谢谢
JAVA实现简单的对FTP上传与下载
简单的实现了单个文件的上传与下载,内附使用方法
如何对下载的FTP地址加密?
新做了一个电影下载网站,因为是会员制。不想让别人盗链,所以,需要对FTP地址加密,各位有何高招呀,
需求变更文档对需求过程中的变更进行进行描述
对需求过程中的变更进行进行描述对需求过程中的变更进行进行描述
如何对unicode类型进行转换
如何对unicode类型进行转换
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件