文档章节

华为CC 华为平台,录音.v3 文件转.wav

sky_hebiao
 sky_hebiao
发布于 2016/12/07 10:26
字数 840
阅读 34
收藏 0
package com.clpc.cc.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.log4j.Logger;

/**
 * 录音文件转码操作
 * @author Administrator
 *
 */
public class V3FileUtil {
	  public static final String VOX_FRAQ_24K = "6000";
	  public static final String VOX_FRAQ_32K = "8000";
	  Logger logger = Logger.getLogger(getClass());

	  private String voxfreq = "6000";

	  public V3FileUtil(){
		  
	  }
	  
	  public V3FileUtil(String voxFreq)
	  {
	    this.voxfreq = voxFreq;
	  }

	  public void long2Byte(byte[] output, long[] input, int len)
	  {
	    int i = 0; for (int j = 0; j < len; j += 4)
	    {
	      output[j] = ((byte)(int)(input[i] & 0xFF));
	      output[(j + 1)] = ((byte)(int)(input[i] >>> 8 & 0xFF));
	      output[(j + 2)] = ((byte)(int)(input[i] >>> 16 & 0xFF));
	      output[(j + 3)] = ((byte)(int)(input[i] >>> 24 & 0xFF));

	      i++;
	    }
	  }

	  public void short2Byte(byte[] output, short sh)
	  {
	    output[0] = ((byte)(int)(sh & 0xFF));
	    output[1] = ((byte)(int)(sh >>> 8 & 0xFF));
	  }

	  public short byte2Short(byte b)
	  {
	    return b < 0 ? (short)(b & 0xFF) : (short)b;
	  }

	  /**
	   * 转换录音格式
	   * @param v3File  输入文件
	   * @param wavFile	输出文件
	   */
	  public void convert(String v3File, String wavFile)
	  {
	    BufferedInputStream fileInput = null;
	    BufferedOutputStream fileOut = null;
	    int[] indsft = { -1, -1, -1, -1, 2, 4, 6, 8 };

	    int[] stpsz = { 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, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794 };

	    int[][] nbl2bit = { { 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 1, 0 }, { 0, 0, 1, 1 }, { 0, 1, 0, 0 }, { 0, 1, 0, 1 }, { 0, 1, 1, 0 }, { 0, 1, 1, 1 }, { 1, 0, 0, 0 }, { 1, 0, 0, 1 }, { 1, 0, 1, 0 }, { 1, 0, 1, 1 }, { 1, 1, 0, 0 }, { 1, 1, 0, 1 }, { 1, 1, 1, 0 }, { 1, 1, 1, 1 } };

	    int[] sgns = { 1, -1 };
	    File file = new File(v3File);

	    int ssindex = 0;
	    if (!file.isFile())
	    {
	      logger.info("There's no file:" + v3File);
	      return;
	    }

	    try
	    {
	      fileInput = new BufferedInputStream(new FileInputStream(file));

	      fileOut = new BufferedOutputStream(new FileOutputStream(wavFile));

	      long[] lPCMHDR = { 1179011410L, 0L, 1163280727L, 544501094L, 16L, 65537L, 0L, 0L, 1048578L, 1635017060L, 0L };
	      lPCMHDR[1] = (4L * file.length() + 36L);
	      lPCMHDR[6] = Integer.parseInt(this.voxfreq);
	      lPCMHDR[7] = (2 * Integer.parseInt(this.voxfreq));
	      lPCMHDR[10] = (4L * file.length());

	      byte[] b = new byte[44];
	      long2Byte(b, lPCMHDR, 44);
	      fileOut.write(b, 0, b.length);
	      fileOut.flush();

	      short iVal = 0;
	      int pos = 0;
	      byte[] szBuf = new byte[131072];

	      byte[] szDesBuf = new byte[524288];
	      int dwRead = 0;

	      while ((dwRead = fileInput.read(szBuf, 0, 131072)) != -1)
	      {
	        for (int idx = 0; idx < dwRead - 1; idx++)
	        {
	          short incoded = (short)(byte2Short(szBuf[idx]) / 16);
	          int diff = sgns[nbl2bit[incoded][0]] * (stpsz[ssindex] * nbl2bit[incoded][1] + stpsz[ssindex] / 2 * nbl2bit[incoded][2] + stpsz[ssindex] / 4 * nbl2bit[incoded][3] + stpsz[ssindex] / 8);

	          ssindex += indsft[(incoded % 8)];

	          if (ssindex < 0)
	          {
	            ssindex = 0;
	          }

	          if (ssindex > 48)
	          {
	            ssindex = 48;
	          }

	          iVal = (short)(iVal + diff);

	          if (iVal > 2047)
	          {
	            iVal = 2047;
	          }
	          else if (iVal < -2047)
	          {
	            iVal = -2047;
	          }

	          byte[] b2 = new byte[2];
	          short2Byte(b2, (short)(iVal * 16));

	          szDesBuf[pos] = b2[0];
	          pos++;
	          szDesBuf[pos] = b2[1];
	          pos++;

	          incoded = (short)(byte2Short(szBuf[idx]) % 16);

	          diff = sgns[nbl2bit[incoded][0]] * (stpsz[ssindex] * nbl2bit[incoded][1] + stpsz[ssindex] / 2 * nbl2bit[incoded][2] + stpsz[ssindex] / 4 * nbl2bit[incoded][3] + stpsz[ssindex] / 8);

	          ssindex += indsft[(incoded % 8)];

	          if (ssindex < 0)
	          {
	            ssindex = 0;
	          }

	          if (ssindex > 48)
	          {
	            ssindex = 48;
	          }

	          iVal = (short)(iVal + diff);

	          if (iVal > 2047)
	          {
	            iVal = 2047;
	          }
	          else if (iVal < -2047)
	          {
	            iVal = -2047;
	          }

	          byte[] b3 = new byte[2];
	          short2Byte(b3, (short)(iVal * 16));
	          szDesBuf[pos] = b3[0];
	          pos++;
	          szDesBuf[pos] = b3[1];
	          pos++;
	        }

	        fileOut.write(szDesBuf, 0, dwRead * 4);
	        fileOut.flush();

	        pos = 0;
	      }

	      logger.info("Transfer v3 file to wav file successfully!");
	    }
	    catch (IOException e)
	    {
	      //logger.info("Transfer v3 file to wav file failed!");
	    }
	    finally
	    {
	      try
	      {
	        if (fileInput != null)
	        {
	          fileInput.close();
	        }
	      }
	      catch (IOException e)
	      {
	        logger.info("File closed error happened when transfer v3 to wav!");
	      }
	      try
	      {
	        if (fileOut != null)
	        {
	          fileOut.close();
	        }
	      }
	      catch (IOException e)
	      {
	        logger.info("File closed error happened when transfer v3 to wav!");
	      }
	    }
	  }
	  
	  public static void main(String[] args) {
		V3FileUtil fu = new V3FileUtil();
		fu.convert("", "");
	}
}

华为根据callID查询对应录音绝对路径

	/**
	 *  
	 * @param callId
	 * @return
	 */
	public String getRecordMonth(String callId){
		String month ="";
		try {
			//截取callID
			String[] ag = callId.split("-");
			//格式化时间
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
			SimpleDateFormat sd = new SimpleDateFormat("MM");
			//基础时间1970年1月1日
			long historyDate = 19700101000000L;
			//转换为毫秒 将callId秒转换为毫秒
			long callIdDate = Long.parseLong(ag[0]) * 1000;
			// 八小时秒数  东八区需要加八小时
			long eastEightArea = 28800000L;
			String strDate = String.valueOf(historyDate);
			long millionSeconds = sdf.parse(strDate).getTime();//毫秒
//			System.out.println(millionSeconds);
			Date date = new Date(millionSeconds + callIdDate +eastEightArea);
			String tableMonth = sd.format(date);
			month = String.valueOf(Integer.valueOf(tableMonth));
//			System.out.println(month);
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("格式化时间异常:"+e);
		}
		return month;
	}

 

© 著作权归作者所有

共有 人打赏支持
上一篇: java I/O操作类
下一篇: 读取配置文件
sky_hebiao
粉丝 0
博文 7
码字总数 4148
作品 0
大兴
后端工程师
私信 提问
呼叫中心架构设计

背景 客户在打电话给客服(坐席)时需要保护自己的隐私(客户电话号码不能透传给客服) 客服在打电话给客户时可根据实际对应业务来设定是否进行号码透传(大部分场景是透传) 对一些业务提供...

88250
2016/07/18
1K
2
Openstack之cinder对接华为FCV3存储及cinder多后端

前言 在以往搭建openstack块存储cinder组件与fc存储对接时,我常采用了节点挂载fc盘,然后再以lvm、filesystem或ceph osd的方式来对接cinder,但这样有着不可避免的性能损耗,其实Openstack...

hiubuntu
2017/01/22
0
0
边录音边转码

一边录音,一边将录制成的 wav 格式音频文件转码成 amr 音频格式。只支持真机运行调试。此代码在之前代码(http://code4app.com/ios/录音并AMR和WAV互转/51565c3e6803fa5c76000005)基础上改...

红薯
2013/08/29
1K
0
AMR和WAV互相转换

---------------------------2015.8.25---------------------------------- ------- 安卓录制的amr转换出现问题的,请百度下载mediainfo,比对demo录制转换的amr参数是否一致。 也有人找我说...

人生好迈
2015/09/22
2.5K
0
【华为】基于vcenter服务器管理功能插件开发项目

一、 项目背景 vcenter是一款IT资源虚拟化管理工具,需要针对vcenter进行插件开发,将华为服务器管理功能集成到vcenter,实现通过vcenter管理界面直接管理华为服务器。 二、 项目目的 本次需...

华为众包
2017/04/27
1
0

没有更多内容

加载失败,请刷新页面

加载更多

window下安装maven

1.下载软件包: 2.解压到当前的安装路径: D:\Maven3.5.3 3.添加环境变量: 新建一个名为:MAVEN_HOME 填写解压路径:D:\Maven3.5.3 打开path,添加:%MAVEN_HOME%\bin 确定即可。 4.验证环境...

狼王黄师傅
5分钟前
0
0
聊聊flink的FsCheckpointStorage

序 本文主要研究一下flink的FsCheckpointStorage CheckpointStorage flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointStorage.java /** * CheckpointStor......

go4it
27分钟前
2
0
makefile 常用函数

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。今天我们来学习下makefile的常用函数。 《GNU make》h...

科陆李明
今天
17
0
Android 报错 Could not find com.android.tools.build:aapt2:3.2.1-4818971.

报错信息: Could not find com.android.tools.build:aapt2:3.2.1-4818971.Searched in the following locations: file:/C:/Users/96110/AppData/Local/Android/Sdk/extras/m2reposito......

lanyu96
今天
9
0
我的Linux系统九阴真经

我的Linux系统九阴真经 在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行...

linuxCool
今天
34
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部