java音频采样转换(音频采样格式怎么处理)

本篇文章给大家谈谈java音频采样转换,以及音频采样格式怎么处理对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、求解,JAVA语言多人语音聊天怎么解决混音问2、java实现 mp3格式转换wav3、怎么通过C#或JAVA得到从麦克风得到声音或它的声频文件?4、Java怎么将.amr 格式的音频转换成 mp3 格式

求解,JAVA语言多人语音聊天怎么解决混音问

两路音视频流,符合以下条件才能混合:

格式相同,要解压成 PCM 格式。

采样率相同,要转换成相同的采样率。主流采样率包括:16k Hz、32k Hz、44.1k Hz 和 48k Hz。

帧长相同,帧长由编码格式决定,PCM 没有帧长的概念,开发者自行决定帧长。为了和主流音频编码格式的帧长保持一致,推荐采用 20ms 为帧长。

位深(Bit-Depth)或采样格式 (Sample Format) 相同,承载每个采样点数据的 bit 数目要相同。

声道数相同,必须同样是单声道或者双声道 (立体声)。这样,把格式、采样率、帧长、位深和声道数对齐了以后,两个音频流就可以混合了。

JAVA代码问题可以到即构开发者中心看看

java音频采样转换(音频采样格式怎么处理)

java实现 mp3格式转换wav

/*

* 实现录音机的功能

*/

package com.liuyun.MyRecord1;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.io.*;

import javax.sound.sampled.*;

import java.lang.*;

public class MyRecord extends JFrame implements ActionListener{

//定义录音格式

AudioFormat af = null;

//定义目标数据行,可以从中读取音频数据,该 TargetDataLine 接口提供从目标数据行的缓冲区读取所捕获数据的方法。

TargetDataLine td = null;

//定义源数据行,源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。

SourceDataLine sd = null;

//定义字节数组输入输出流

ByteArrayInputStream bais = null;

ByteArrayOutputStream baos = null;

//定义音频输入流

AudioInputStream ais = null;

//定义停止录音的标志,来控制录音线程的运行

Boolean stopflag = false;

//记录开始录音的时间

long startPlay;

//定义所需要的组件

JPanel jp1,jp2,jp3;

JLabel jl1=null;

JButton captureBtn,stopBtn,playBtn,saveBtn;

public static void main(String[] args) {

//创造一个实例

MyRecord mr = new MyRecord();

}

//构造函数

public MyRecord()

{

//组件初始化

jp1 = new JPanel();

jp2 = new JPanel();

jp3 = new JPanel();

//定义字体

Font myFont = new Font(“华文新魏”,Font.BOLD,30);

jl1 = new JLabel(“录音机功能的实现”);

jl1.setFont(myFont);

jp1.add(jl1);

captureBtn = new JButton(“开始录音”);

//对开始录音按钮进行注册监听

captureBtn.addActionListener(this);

captureBtn.setActionCommand(“captureBtn”);

//对停止录音进行注册监听

stopBtn = new JButton(“停止录音”);

stopBtn.addActionListener(this);

stopBtn.setActionCommand(“stopBtn”);

//对播放录音进行注册监听

playBtn = new JButton(“播放录音”);

playBtn.addActionListener(this);

playBtn.setActionCommand(“playBtn”);

//对保存录音进行注册监听

saveBtn = new JButton(“保存录音”);

saveBtn.addActionListener(this);

saveBtn.setActionCommand(“saveBtn”);

this.add(jp1,BorderLayout.NORTH);

this.add(jp2,BorderLayout.CENTER);

this.add(jp3,BorderLayout.SOUTH);

jp3.setLayout(null);

jp3.setLayout(new GridLayout(1, 4,10,10));

jp3.add(captureBtn);

jp3.add(stopBtn);

jp3.add(playBtn);

jp3.add(saveBtn);

//设置按钮的属性

captureBtn.setEnabled(true);

stopBtn.setEnabled(false);

playBtn.setEnabled(false);

saveBtn.setEnabled(false);

//设置窗口的属性

this.setSize(400,300);

this.setTitle(“录音机”);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setLocationRelativeTo(null);

this.setVisible(true);

}

public void actionPerformed(ActionEvent e) {

if(e.getActionCommand().equals(“captureBtn”))

{

//点击开始录音按钮后的动作

//停止按钮可以启动

captureBtn.setEnabled(false);

stopBtn.setEnabled(true);

playBtn.setEnabled(false);

saveBtn.setEnabled(false);

//调用录音的方法

capture();

//记录开始录音的时间

startPlay = System.currentTimeMillis();

}else if (e.getActionCommand().equals(“stopBtn”)) {

//点击停止录音按钮的动作

captureBtn.setEnabled(true);

stopBtn.setEnabled(false);

playBtn.setEnabled(true);

saveBtn.setEnabled(true);

//调用停止录音的方法

stop();

//记录停止录音的时间

long stopPlay = System.currentTimeMillis();

//输出录音的时间

System.out.println(“Play continues ” + (stopPlay-startPlay));

}else if(e.getActionCommand().equals(“playBtn”))

{

//调用播放录音的方法

play();

}else if(e.getActionCommand().equals(“saveBtn”))

{

//调用保存录音的方法

save();

}

}

//开始录音

public void capture()

{

try {

//af为AudioFormat也就是音频格式

af = getAudioFormat();

DataLine.Info info = new DataLine.Info(TargetDataLine.class,af);

td = (TargetDataLine)(AudioSystem.getLine(info));

//打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。

td.open(af);

//允许某一数据行执行数据 I/O

td.start();

//创建播放录音的线程

Record record = new Record();

Thread t1 = new Thread(record);

t1.start();

} catch (LineUnavailableException ex) {

ex.printStackTrace();

return;

}

}

//停止录音

public void stop()

{

stopflag = true;

}

//播放录音

public void play()

{

//将baos中的数据转换为字节数据

byte audioData[] = baos.toByteArray();

//转换为输入流

bais = new ByteArrayInputStream(audioData);

af = getAudioFormat();

ais = new AudioInputStream(bais, af, audioData.length/af.getFrameSize());

try {

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, af);

sd = (SourceDataLine) AudioSystem.getLine(dataLineInfo);

sd.open(af);

sd.start();

//创建播放进程

Play py = new Play();

Thread t2 = new Thread(py);

t2.start();

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

//关闭流

if(ais != null)

{

ais.close();

}

if(bais != null)

{

bais.close();

}

if(baos != null)

{

baos.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

//保存录音

public void save()

{

//取得录音输入流

af = getAudioFormat();

byte audioData[] = baos.toByteArray();

bais = new ByteArrayInputStream(audioData);

ais = new AudioInputStream(bais,af, audioData.length / af.getFrameSize());

//定义最终保存的文件名

File file = null;

//写入文件

try {

//以当前的时间命名录音的名字

//将录音的文件存放到F盘下语音文件夹下

File filePath = new File(“F:/语音文件”);

if(!filePath.exists())

{//如果文件不存在,则创建该目录

filePath.mkdir();

}

long time = System.currentTimeMillis();

file = new File(filePath+”/”+time+”.wav”);

AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file);

//将录音产生的wav文件转换为容量较小的mp3格式

//定义产生后文件名

String tarFileName = time+”.mp3″;

Runtime run = null;

try {

run = Runtime.getRuntime();

long start=System.currentTimeMillis();

//调用解码器来将wav文件转换为mp3文件

strongspan style=”color:#ff0000;”Process p=run.exec(filePath+”/”+”lame -b 16 “+filePath+”/”+file.getName()+” “+filePath+”/”+tarFileName); //16为码率,可自行修改

/span/strong//释放进程

p.getOutputStream().close();

p.getInputStream().close();

p.getErrorStream().close();

p.waitFor();

long end=System.currentTimeMillis();

System.out.println(“convert need costs:”+(end-start)+”ms”);

//删除无用的wav文件

if(file.exists())

{

file.delete();

}

} catch (Exception e) {

e.printStackTrace();

}finally{

//最后都要执行的语句

//run调用lame解码器最后释放内存

run.freeMemory();

}

} catch (Exception e) {

e.printStackTrace();

}finally{

//关闭流

try {

if(bais != null)

{

bais.close();

}

if(ais != null)

{

ais.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

//设置AudioFormat的参数

public AudioFormat getAudioFormat()

{

//下面注释部分是另外一种音频格式,两者都可以

AudioFormat.Encoding encoding = AudioFormat.Encoding.

PCM_SIGNED ;

float rate = 8000f;

int sampleSize = 16;

String signedString = “signed”;

boolean bigEndian = true;

int channels = 1;

return new AudioFormat(encoding, rate, sampleSize, channels,

(sampleSize / 8) * channels, rate, bigEndian);

//      //采样率是每秒播放和录制的样本数

//      float sampleRate = 16000.0F;

//      // 采样率8000,11025,16000,22050,44100

//      //sampleSizeInBits表示每个具有此格式的声音样本中的位数

//      int sampleSizeInBits = 16;

//      // 8,16

//      int channels = 1;

//      // 单声道为1,立体声为2

//      boolean signed = true;

//      // true,false

//      boolean bigEndian = true;

//      // true,false

//      return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,bigEndian);

}

//录音类,因为要用到MyRecord类中的变量,所以将其做成内部类

class Record implements Runnable

{

//定义存放录音的字节数组,作为缓冲区

byte bts[] = new byte[10000];

//将字节数组包装到流里,最终存入到baos中

//重写run函数

public void run() {

baos = new ByteArrayOutputStream();

try {

stopflag = false;

while(stopflag != true)

{

//当停止录音没按下时,该线程一直执行

//从数据行的输入缓冲区读取音频数据。

//要读取bts.length长度的字节,cnt 是实际读取的字节数

int cnt = td.read(bts, 0, bts.length);

if(cnt  0)

{

baos.write(bts, 0, cnt);

}

}

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

//关闭打开的字节数组流

if(baos != null)

{

baos.close();

}

} catch (IOException e) {

e.printStackTrace();

}finally{

td.drain();

td.close();

}

}

}

}

//播放类,同样也做成内部类

class Play implements Runnable

{

//播放baos中的数据即可

public void run() {

byte bts[] = new byte[10000];

try {

int cnt;

//读取数据到缓存数据

while ((cnt = ais.read(bts, 0, bts.length)) != -1)

{

if (cnt  0)

{

//写入缓存数据

//将音频数据写入到混频器

sd.write(bts, 0, cnt);

}

}

} catch (Exception e) {

e.printStackTrace();

}finally{

sd.drain();

sd.close();

}

}

}

}

怎么通过C#或JAVA得到从麦克风得到声音或它的声频文件?

InputDeviceInputDevice界面提供一个方法getInputChannel来获得一个InputChannel对象,从中捕获可读的音频数据。OutputDeviceOutputDevice界面提供一个方法getOutputChannel来获得一个OutputChannel对象,音频数据可以写入该输出通道,并予播放。MixerMixer支持多个InputChannel和/或Clip。 另外,它提供了查询方法,从中可得到它所支持的通道数量,它也提供了支持同步暂停和唤醒多个通道播放的方法。控件通道和音频端口 (比如扬声器和麦克风)一般能支持一组控件比如增益和定位。通过将它的类作为参数传给getControl()方法,JAVA声音 API的通道对象和端口对象可以获得一个特别的控件。编码器Codecs可以对音频数据编码和解码,允许在不同格式和编码之间转换。JAVA声音 API通过AudioSystem类中的方法为这些转换提供了高级接口。如果给了一个特殊的音频流,应用程序会查询音频系统来找到相应的转换,从而得到指定格式的音频流。文件和流音频流是与音频数据格式和数据长度相关的输入流,文件流是与文件类型和数据长度相关的输入流。JAVA声音 API在AudioSystem类中为音频文件和音频流之间的转换提供了接口。查询和访问安装组件AudioSystem类充当到采样音频系统资源入口的角色。该类允许程序员查询和访问输入设备、输出设备以及安装好的混音设备。另外,AudioSystem包含许多在不同音频数据格式间转换的方法。它也提供一些方法,使得在不需要对设备直接操作的情况下,直接获得输入通道或输出通道。你可以试试做

Java怎么将.amr 格式的音频转换成 mp3 格式

步骤

运行添加文件。打开狸(liwo)窝全能转换器后,单击界面左上角的第一个按钮“添加”,浏览打开文件夹并将amr音乐文件导入到。有的用户可以会疏忽的,就是在打开文件夹时没发现有amr文件,其实有可能忘掉选择文件类型了,选择All Files(*.*),即所有文件,就可以看到了。

编辑。提供有编辑和3D效果的功能,这是对而言的。对于音频,我们可以使用的编辑功能。单击主界面左上方第二个按钮“编辑”,即可进入编辑窗口。如图所示,可以对音频进行切割,比如音乐太大的时候可以用,剪掉不需要的一段,保存需要的一段。

选择预置方案。支持输出aac、ac3、aiff、amr、m4a、mp2、mp3、ogg、ra、au、wav、wma、mka、flac(无损)、wav(无损)等格式音频。这里在分类“常用音频”中就可以找到需要转换的mp3格式-MP3-MPEG Layer-3 Audio (*.mp3) 流行的音频格式,具有很好的音质和很小的体积。

参数设置。在“预置方案”右边是“高级设置”,单击进入设置窗口,可以进行音频参数设置。新手不用进行此项设置,因为已经按照常用格式,使用范围等进行分类设置了,其参数相差不大。只是按照所需要的在预置方案中选择相应格式即可。

5

开始转换。设置完毕后,单击主界面右下角的圆形按钮,开始转换音频文件。转换没有先后顺序,是同时进行转换。转换速度较快,加上音频文件体积本来就不大,最多的一分钟即可转换完毕

java音频采样转换的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于音频采样格式怎么处理、java音频采样转换的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 12:34:20
下一篇 2024年4月1日 12:44:39

相关推荐

  • java读取文件内容乱码,java读取文件编码格式

    java中filewriter中文乱码怎么解决? 1、如果你期望写到文件中的汉字是 GBK编码,可以写文件时,将字符串准换成 GBK编码的byte[]。网页编码和输出流编码一致。 2、读取文件的时候如果是用的read方法(字节流),碰到中文输出就是乱码,然后存储的时候设置下编码为GBK或者是UTF-8形式即可,可以有效的解决乱码问题。 3、只是个别文件出现了…

    2024年5月23日
    4900
  • excel照片查看格式文件大小,excel图片查看

    EXCEL里怎么样查看图片的大小 1、利用Windows自带的画图软件查看。 在EXCEL里右键点击你的图片,选择复制。 打开画图,按Ctrl+V粘贴。 鼠标指向白色画布右下角的小蓝标,按下拖动至与你图片一样大,然后按Ctrl+E。 2、点击图片–右键–设置图片格式–大小。 3、点图片,按右键,复制,再打开“开始-程序-画…

    2024年5月23日
    4700
  • excel单元格的混合引用,单元格混合引用格式

    什么是excel的相对引用绝对引用和混合引用 相对引用:公式中的相对单元格引用(如 A1)是基于包含公式和单元格引用的单元格的相对位置。如果公式所在单元格的位置改变,引用也随之改变。 如果多行或多列地复制或填充公式,引用会自动调整。 相对引用:公式中的相对单元格引用是基于包含公式和单元格引用的单元格的相对位置。如果公式所在单元格的位置改变,引用也随之改变。如…

    2024年5月23日
    7400
  • excel去除文本格式,excel表格如何去除文本格式

    excel怎样清除格式? Excel单元格数据内容及格式清除方法:打开“素材.xlsx”文件,选择A2单元格,将光标定位于编辑栏,按【Delete】键将文本清除。可以看到文字内容已经被删除了,但格式依然存在,如批注、单元格中数值的字体和字号格式等。 首先打开一个已经套用了表格格式的电子表格。然后将套用了格式的表格全部选中。单击“开始”菜单标签,再单击工具栏“…

    2024年5月23日
    4000
  • java中时间戳类型,java时间戳类型格式

    postgresql的timestamp对应java什么类型 Timestamp是 java.sql.Date的子类, Timestamp 也提供支持时间戳值的 JDBC 转义语法的格式化和解析操作的能力。 对应java中的java.sql.Timestamp类型(注意命名空间)。保存到数据库这样做:Timestamp.valueOf(时间);注意时间的格式…

    2024年5月23日
    4100
  • excel文件怎么转换格式,excel文档格式怎么转换

    excel怎么转换成xlsx? 首先在安装有Excel 2007版本以上的电脑里面将XLSX文件打开。开了文件之后,点击左上角的文件选项。在弹出来的下拉菜单里面点击另存为。接着在保存类型里面选择为03版本支持的格式XLS格式。 方法下载兼容包软件 下载安装官方提供的兼容补丁后可以实现所以版本之间的互通,安装完成以后,重启计算机可以直接用Excel 2003打…

    2024年5月23日
    4300
  • c语言字符中除去字符,c语言中输出字符的格式字符

    C语言“在字符串中删除指定的字符”?怎么编写程序 1、c语言中书写删除字符串中某个字符的程序的具体操作步骤如下:编写头函数,包括“#include stdio.h.”与“#include string.h.“。定义两个相同容量的字符串储存的变量 char a【100】; char b【100】。 2、输入:第一行是一个字符串; 第二行是一个字符。输出:删除指…

    2024年5月23日
    4400
  • 关于2013excel设置批注格式的信息

    Excel批注的添加、设置格式和打印操作 (1)右击批注单元格,选择“ 编辑批注 ”。再 右击批注边框 (而不是内容),选择“ 设置批注格式 ”。(2)在“ 设置批注格式 ”对话框中,选择“ 颜色与线条 ”选项卡。 批注边框上点击右键,【设置批注格式】【颜色与线条】【选项颜色下拉箭头】【填充效果】【图片】,然后选择图片路径确定即可。 打开Excel表格,点击…

    2024年5月23日
    5200
  • 日期格式java,日期格式yyyy一mm一dd转文本

    Java中怎么把字符串转换成日期格式啊 定义一个字符串类型的时间;创建一个SimpleDateFormat对象并设置格式;最后使用SimpleDateFormat的parse方法将String类型的时间转换成Date类型的时间。 SimpleDateFormat sdf = new SimpleDateFormat( yyyy年MM月dd日 );String…

    2024年5月23日
    4900
  • c语言打印整数,c语言打印整数的格式符为

    用c语言打印1~n的所有整数用递归 1、把这个数当作字符来处理,定义字符数组,顺序输入,反序输出即可,用不到递归。 2、你这个程序是对的啊。你每次到4结束之后要返回到上一级调用,然后他们可能会执行下一个循环的。 3、问题分析:要把整数逐位输出,无论正序还是反序,都需要将各个位分离。在C中的做法就是,通过对10取余,取出个位,然后通过除以10,起到“移位”的效…

    2024年5月22日
    4800

发表回复

登录后才能评论



关注微信