文档章节

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

sky_hebiao
 sky_hebiao
发布于 2016/12/07 10:26
字数 840
阅读 10
收藏 0
点赞 0
评论 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;
	}

 

© 著作权归作者所有

共有 人打赏支持
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
lame wav字节流转换为mp3字节流并输出

请问哪个大虾知道怎么用lame将wav转换为mp3?输入wav字节流,输出转换后的mp3字节流,网上都是读取wav文件去转的,读取文件直接转换为了short int数组,但我需要用jni用录音后传入的是byte数...

BoXuan
2015/12/14
336
0
iOS音频格式之AMR和WAV互转(更新支持64位)

---------------------------2016.6.15---------------------------------- ------- 有些小伙伴遇到想把采样率调高到16kHZ,关于arm-wb,请戳这里:编译vo-armwbenc iOS (16kHZ wav文件转amr......

Jeans
2012/07/31
0
17
地质调查走上云端 国家地质云平台正式上线背后的技术力量

中国地质调查局“地质云”平台的正式上线,意味着我国地质信息一站式云端服务的全新工作模式已经到来。 2017年11月18日06时34分,在西藏林芝市米林县发生6.9级地震,震源深度10千米。为支撑抢...

m59ht9d0j
2017/12/07
0
0
云平台项目实战(华为篇)之存储技术

本次云平台项目采用的华为高端存储6800 V3 产品,具有高规格的硬件结构,块和文件一体化的软件架构,结合多种高级数据应用和数据保护技术,使存储系统具有高性能、高可扩展性、高可靠性和高可...

东方之子7366
2016/09/04
0
0
android音频编辑之音频转换PCM与WAV

前言 本篇开始讲解在Android平台上进行的音频编辑开发,首先需要对音频相关概念有基础的认识。所以本篇要讲解以下内容: 常用音频格式简介 WAV和PCM的区别和联系 WAV文件头信息 采样率简介 ...

Ihesong
01/12
0
0
使用Festivox创建Festival英语语音库

所用版本:EST 2.1, Festival 2.1, Festvox2.4(该版本兼容Festival2.1,官方发布的Festvox2.1版本可能存在兼容问题) The process is fairly long, recording and labelling take a few hour......

Cherrot
2011/08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
1分钟前
0
0
设计模式:代理模式

代理模式可以分为三种:静态代理,动态代理,cglib代理 1.静态代理:被代理的类需要实现一接口或是继承一父类 委托类(被代理的类): package com.java.pattern.proxy.staticdemo;publ...

人觉非常君
4分钟前
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
10分钟前
0
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
10分钟前
0
0
TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
12分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型

刘祖鹏
18分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
22分钟前
0
0
TensorFlow gpu 版 安装

win10 + Python3.6 下载cuda https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=81&target_type=exelocal 下载cudnn,复制链接地址,使用迅......

阿豪boy
40分钟前
0
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
41分钟前
0
0
防火墙未来的发展趋势在哪里?

导读 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网。当下互联网时代,无论是大小企业,大部分都会部署有防火墙的设备,但这些防火墙往往并不...

问题终结者
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部