首页 装机必备 正文

lame.exe java实现录音功能

java实现录音功能

前几次博客中也是用java实现录音机的各种功能,这次是比先前有了一点优化,将录音的功能单独提取出来,这个程序的实现用到了编码器LAME.exe这个的作用是将录音得到的wav文件编码成MP3文件,这样的结果是容量大大减少,因为LAME编码器经测试在编码过程中路径中带有空格问题未能解决,所以只能找了一个笨的方法,为了将其放到指定的文件夹下(这个文件夹路径是带有空格的),所以只能先存放到D盘,然后利用文件操作将其复制到指定的路径下,然后再删除,程序中还用到了图片,修改了java的图标,所以在运行时可将其注释掉,写的很烂,相互学习哈!

/* * 实现录音机的功能 * 1.在原来的基础上界面更加精简,字体变大使用户更加方便 * 2.在停止录音后便直接保存为.mp3文件 * 3.对停止录音进行改进,将录音按钮设计成类似微信的形式,按下时进行录音,松开即停止录音并保存即可 * 4.在录音的时候在面板上显示音频波,表示正在录音 */package com.liuyun.MyRecord6; import java.awt.*; import javax.swing.*;import java.awt.event.*;import java.io.*; import javax.sound.sampled.*; import java.lang.*; public class MyRecord6 extends JFrame implements MouseListener{ //定义录音格式 AudioFormat af = null; //定义目标数据行,可以从中读取音频数据,该 TargetDataLine 接口提供从目标数据行的缓冲区读取所捕获数据的方法。 TargetDataLine td = null; //定义源数据行,源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。 SourceDataLine sd = null; //定义字节数组输入输出流 ByteArrayInputStream bais = null; ByteArrayOutputStream baos = null; //定义音频输入流 AudioInputStream ais = null; //定义停止录音的标志,来控制录音线程的运行 Boolean stopflag = false; //记录开始录音的时间 long startPlay; //设置一个播放的标志 Boolean playflag; //每次保存的最后的文件名 File tarFile = null; //定义音频波形每次显示的字节数 int intBytes = 0; //定义每次录音的时候每次提取字节来画音频波 byte audioDataBuffer[] = null; //定义所需要的组件 JPanel jp1,jp2,jp3; JLabel jl1=null; JButton captureBtn; //设置画波形线程的终止的标志 boolean flag = true; //定义播放录音时的一个计数值 int cnt; //定义播放录音时一个缓冲数组 byte btsPlay[] = null; int gridx, gridy, gridwidth, gridheight, anchor, fill, ipadx, ipady; double weightx, weighty; Insets inset; GridBagConstraints c; public static void main(String[] args) { //创造一个实例 MyRecord6 mr = new MyRecord6(); } //构造函数 public MyRecord6() { //组件初始化 jp1 = new JPanel(); jp2 = new JPanel(); jp3 = new JPanel(); //定义jp1的字体 Font jpFont = new Font("华文新魏",Font.BOLD,40); jl1 = new JLabel("请留下您想说的话"); jl1.setFont(jpFont); jl1.setForeground(Color.red); jp1.add(jl1); //定义按钮上面的字体 Font btFont = new Font("华文新魏",Font.BOLD,40); captureBtn = new JButton("按住 说话"); //setForeground可以设置按钮上面字体的颜色 captureBtn.setForeground(Color.RED); captureBtn.setFont(btFont); //对开始录音按钮进行鼠标监听 captureBtn.addMouseListener(this); this.add(jp1,BorderLayout.NORTH); this.add(jp2,BorderLayout.CENTER); this.add(jp3,BorderLayout.SOUTH); GridBagLayout gridbag = null; jp3.setLayout(gridbag = new GridBagLayout()); gridx=1; gridy=2; gridwidth=1; gridheight=1; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(1,1,1,1); ipadx=0; ipady=30; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(captureBtn, c); jp3.add(captureBtn); //设置窗口的属性 this.setSize(800,500); this.setTitle("录音机"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗口居中 this.setLocationRelativeTo(null); //将窗口的边框去掉 this.setUndecorated(true); this.setVisible(true); //设置窗口上的图标 Image img = this.getToolkit().getImage(getClass().getResource("/image/Recorder.jpg")); this.setIconImage(img); //设置窗口在最前端显示 this.setAlwaysOnTop(true); } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { //当开始录音按钮被按下时就开始录音 if(e.getSource().equals(captureBtn)) { //改变按钮上面的字的内容 captureBtn.setText("松开 结束"); //调用录音的方法 capture(); //记录开始录音的时间 startPlay = System.currentTimeMillis(); } } public void mouseReleased(MouseEvent e) { //当松开录音按钮时停止录音并保存录音的文件 if(e.getSource().equals(captureBtn)) { //调用停止录音的方法 stop(); //当松开按钮后对显示波形的面板进行清空 jp2.repaint(); //改变按钮上面的字的内容 captureBtn.setText("按住 说话"); //调用保存录音的方法 save(); //将其放到指定的路径下 //定义最终要存放的文件路径 String destPath = "D:/Program Files/apache-tomcat-6.0.35/webapps/XWZ/tempFile/"; copyFile("D:/"+tarFile.getName(), destPath); System.exit(0); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } //开始录音 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(); //启动显示波形的进程 RecordWave aw = new RecordWave(); Thread t2 = new Thread(aw); t2.start(); //把显示波形的进程标志设为true flag = true; Record record = new Record(); Thread t1 = new Thread(record); t1.start(); } catch (Exception ex) { ex.printStackTrace(); return; } } //停止录音 public void stop() { stopflag = true; //将画波形的进程终止 flag = false; } //保存录音 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("D:/AudioFile"); String tarPath = "D:/"; if(!filePath.exists()) {//如果文件不存在,则创建该目录 filePath.mkdirs(); } long time = System.currentTimeMillis(); file = new File(filePath+"/"+time+".wav"); AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file); //将录音产生的wav文件转换为容量较小的mp3格式 //定义产生后文件名 tarFile = new File(tarPath+time+".mp3"); Runtime run = null; //测试当前的路径 try { run = Runtime.getRuntime(); //调用编码器来将wav文件转换为mp3文件 //把编码得到的mp3文件先存放到D盘下,然后利用文件拷贝函数将它放到指定的文件夹下同时将D盘下的文件删除 Process p=run.exec(filePath+"/"+"lame -b 16 "+filePath+"/"+file.getName()+" "+tarPath+tarFile.getName()); //16为码率,可自行修改 //释放进程 p.getOutputStream().close(); p.getInputStream().close(); p.getErrorStream().close(); //等待 p.waitFor(); // //删除之前保存的的wav文件// if(file.exists())// {// file.delete();// } // //定义最终要存放的文件路径// String destPath = "D:/Program Files/apache-tomcat-6.0.35/webapps/XWZ/tempFile/";// copyFile(tarPath+tarFile.getName(), destPath); } 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(); } } } //文件拷贝方法 public void copyFile(String srcPath , String destPath) { File srcFile = new File(srcPath); //如果目的文件夹没有则创建目的文件夹 (new File(destPath)).mkdirs(); //在目的文件夹下创建要复制的文件 File destFile = new File(destPath+"/"+srcFile.getName()); if(srcFile.isFile() && srcFile.exists()) { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(srcFile); out = new FileOutputStream(destFile); //设置缓冲数组 byte[] buff = new byte[1024*5]; int len = 0; while ((len = in.read(buff)) != -1) { out.write(buff, 0, len); }// //测试该函数是否执行// System.out.println("ok1"); } catch(Exception e) { e.printStackTrace(); }finally{ //关闭流,先开的后关闭 try { if(out != null) { out.close(); } if(in != null) { in.close(); } } catch (Exception e) { e.printStackTrace(); } } } //复制过后删除源文件夹中的的文件 if(srcFile.exists()) { srcFile.delete(); } } //设置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); } //开始从音频流中读取字节数 byte copyBts[] = bts; bais = new ByteArrayInputStream(copyBts); ais = new AudioInputStream(bais, af, copyBts.length/af.getFrameSize()); try{ DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, af); sd = (SourceDataLine) AudioSystem.getLine(dataLineInfo); sd.open(af); sd.start(); //从音频流中读取 int Buffer_Size = 10000; audioDataBuffer = new byte[Buffer_Size]; int outBytes; intBytes = ais.read(audioDataBuffer, 0,audioDataBuffer.length); // 不写到混频器中这样就不会播放// if (intBytes >= 0) {// outBytes = sd.write(audioDataBuffer, 0,audioDataBuffer.length);// } }catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); }finally{ try { //intBytes = -1; //关闭打开的字节数组流 if(baos != null) { baos.close(); } } catch (Exception e) { e.printStackTrace(); }finally{ //下面这句td.drain()不能要,这样如果不播放数据就阻塞再次录音会出现其他程序访问错误 //td.drain(); td.close(); //刷新显示波形的面板 jp2.repaint(); } } } } //画波形的类 //因为要使用一些主函数中的数据,所以做成内部类 class RecordWave extends JPanel implements Runnable { //用画笔画出波形 public void paint(Graphics g) { super.paint(g); g.fillRect(jp2.getX(),jp2.getY() , 800, 380); if( audioDataBuffer != null) { g.drawLine(jp2.getWidth() / 256, 700, jp2.getWidth() / 256, 700); for(int i=0; i<audioDataBuffer.length-1; ++i) { g.setColor(Color.RED); g.drawLine(i * jp2.getWidth() / 256, (int)audioDataBuffer[i]+200 , (i + 1) * jp2.getWidth() / 256, (int)audioDataBuffer[i+1]+200); } } } public void run() { //刷新波形 while(true) { //System.out.println("ok"); try { synchronized (this) { //隔多长时间获取 Thread.sleep(300); } } catch (Exception e) { e.printStackTrace(); } this.paint(jp2.getGraphics()); //终止线程 if(flag == false) { break; } } } } }

————————————————

XRecode 3 v1151 是 功能强大的多线程全面的格式支持音频转换工具

XRecode 3 v1.151 是一款功能强大的音频转换工具,它能够帮助用户将音频文件在不同格式之间进行转换,并提供了一系列其他的音频处理功能。以下是关于 XRecode 3 v1.151 的详细介绍:

功能特点

音频转换 :支持几乎所有常见和许多罕见的音频格式,包括 MP3、WAV、FLAC、AAC、OGG 等,可以将这些格式之间相互转换。多任务处理 :支持批量处理,用户可以一次性转换多个音频文件,提高工作效率。内置编辑器 :提供基本的音频编辑功能,如裁剪、淡入淡出、音量调整等。CD 提取 :能够从音频 CD 中提取音轨并保存为数字音频文件。音频标签编辑 :支持编辑音频文件的元数据,包括标题、艺术家、专辑等信息。音频效果处理 :可以应用音频效果和过滤器,如均衡器、混响、减噪等。多种输出设置 :提供丰富的输出设置选项,包括编解码器参数、比特率、采样率等。

优势和适用场景

全面的格式支持 :XRecode 3 能够应对各种音频格式的转换需求,包括一些较为特殊的格式,使其适用范围更广。批量处理 :对于需要批量转换或处理大量音频文件的用户来说,XRecode 3 的多任务处理功能非常有用,可节省大量时间和精力。简洁易用 :界面设计简洁直观,操作相对便利,即使对音频处理不够熟悉的用户也能够快速上手。内置编辑器 :具备基本的音频编辑功能,避免了用户需要额外使用其他编辑软件的麻烦。

总结

XRecode 3 v1.151 是一款功能全面、操作简单的音频转换工具,适用于需要频繁进行音频格式转换和处理的用户群体。其全面的格式支持和批量处理能力使得用户可以高效地处理大量音频文件,同时其内置编辑器和音频效果处理功能也为用户提供了更多的灵活性和选择空间。

XRecode 3 v1.151 是一款多功能的音频转换工具,提供了广泛的音频处理和转换功能。以下是 XRecode 3 v1.151 的主要功能分类:

1. 音频转换功能

格式转换 :支持几乎所有常见和许多罕见的音频格式之间的相互转换,如 MP3、WAV、FLAC、AAC、OGG、ALAC、Opus 等。批量转换 :允许一次性转换多个文件,提高工作效率。多线程支持 :利用多核 CPU 提高转换速度。

2. 音频提取功能

CD 提取 :从音频 CD 中提取音轨并保存为数字音频文件。视频音轨提取 :从视频文件中提取音频部分,并转换为所需的音频格式。

3. 音频编辑功能

基本编辑 :可以进行裁剪、剪切、复制、粘贴等基本操作。音量调整 :支持对音频文件进行增益调整。淡入淡出 :可以添加淡入淡出的效果。合并拆分 :允许将多个音频文件合并成一个,或将一个音频文件拆分成多个部分。

4. 音频标签管理

元数据编辑 :支持编辑音频文件的元数据(ID3 标签),如标题、艺术家、专辑、年份、流派等。自动标签 :根据文件名或在线数据库自动填写元数据。

5. 音频效果处理

均衡器 :提供均衡器来调整不同频率的增益。动态范围压缩 :减少音频信号的动态范围。音频过滤器 :支持应用各种音频过滤器,如低通、高通等。

6. 输出设置

编解码器参数 :用户可以自定义输出文件的编解码器参数,如比特率、采样率、声道等。预设配置 :提供预设配置,方便快速选择常用的转换设置。

7. 其他功能

命令行支持 :支持通过命令行进行批量操作,适合高级用户和自动化任务。播放功能 :内置简单的音频播放器,可以在转换前试听音频文件。日志记录 :记录转换过程中的详细日志信息,便于排查问题。

总结

XRecode 3 v1.151 通过其全面的功能分类,为用户提供了强大的音频转换和处理能力。无论是需要转换音频格式、提取音轨、编辑音频文件,还是管理音频标签和应用音频效果,这款软件都能够满足用户的需求。其批量处理和多线程支持功能更是大大提高了处理效率,使其成为一款非常实用的音频工具。

XRecode 3 v1.151 是一款功能强大的音频转换工具,其底层原理涉及多个方面,包括音频编解码、多媒体框架、多线程处理等技术。以下是 XRecode 3 v1.151 可能涉及的底层原理:

1. 音频编解码

XRecode 3 v1.151 支持多种音频格式的转换,这涉及到音频编解码的技术。它可能利用现有的音频编解码库或者自行实现音频编解码算法来进行音频格式之间的相互转换,以确保转换过程中音频数据的准确性和质量。

2. 多媒体框架

XRecode 3 v1.151 在处理音频文件时可能使用了一些底层的多媒体框架,如 FFmpeg、GStreamer 等,这些框架提供了丰富的音视频处理功能,包括解析、编解码、处理和播放等,为 XRecode 3 提供了强大的底层支持。

3. 多线程处理

为了提高转换效率,XRecode 3 v1.151 可能采用了多线程处理技术,利用多核 CPU 来并行处理多个音频文件的转换任务,加快处理速度,提高软件的性能表现。

4. GUI 框架

XRecode 3 v1.151 的用户界面可能是基于某种 GUI 框架开发的,比如 Qt、WinForms、WPF 等,这些框架提供了丰富的界面组件和事件处理机制,帮助开发人员构建直观友好的用户界面。

5. 文件 I/O

在进行音频文件读取、写入和处理时,XRecode 3 v1.151 使用了文件 I/O 技术,包括对文件的读取、写入、定位和缓存等操作,以确保对音频文件的有效管理和处理。

6. 第三方库

XRecode 3 v1.151 可能使用了大量的第三方库,如音频处理库、标签编辑库、效果处理库等,以便实现各种复杂的音频处理功能。

综合来看,XRecode 3 v1.151 的底层原理涉及多个方面的技术,包括音频编解码、多媒体框架、多线程处理、GUI 框架、文件 I/O 和第三方库的使用等。这些技术的综合运用使得 XRecode 3 能够提供强大的音频转换和处理能力。

XRecode 3 v1.151 是一款功能强大的音频转换工具,其架构可以分为前端和后端两部分。以下是 XRecode 3 v1.151 的架构概述:

1. 前端架构

前端架构主要包括用户界面和用户交互部分。XRecode 3 v1.151 的前端可能是基于某种 GUI 框架开发的,如 Qt、WinForms、WPF 等,通过这些框架提供的界面组件和事件处理机制来构建直观友好的用户界面。前端负责接收用户输入、展示音频文件列表、提供设置选项和操作按钮等,使用户能够方便地进行音频转换和处理的配置和操作。

2. 后端架构

后端架构是 XRecode 3 v1.151 的核心部分,主要负责音频转换和处理的实际执行。后端架构可能涉及以下几个关键组件:

音频编解码器 :后端使用音频编解码器来处理不同格式的音频文件,包括解码输入文件和编码输出文件。它可能使用现有的音频编解码库或自行实现音频编解码算法。多媒体框架 :后端可能使用底层的多媒体框架,如 FFmpeg、GStreamer 等,来处理音频文件的解析、编解码、处理和播放等操作。这些框架提供了丰富的音视频处理功能,为 XRecode 3 提供了强大的底层支持。多线程处理 :后端可能采用多线程处理技术,利用多核 CPU 来并行处理多个音频文件的转换任务,以提高转换效率和性能。文件 I/O :后端使用文件 I/O 技术进行音频文件的读取、写入和处理,包括对文件的读取、写入、定位和缓存等操作,以确保对音频文件的有效管理和处理。标签编辑器 :后端可能包含标签编辑器组件,用于编辑音频文件的元数据(ID3 标签),如标题、艺术家、专辑、年份、流派等。效果处理器 :后端可能包含效果处理器组件,用于应用音频效果,如均衡器、动态范围压缩、音频过滤器等,以改善音频的音质和效果。

综合来看,XRecode 3 v1.151 的架构由前端和后端两部分组成。前端负责用户界面和用户交互,后端负责音频转换和处理的实际执行,包括音频编解码、多媒体框架、多线程处理、文件 I/O、标签编辑器和效果处理器等组件的协作。这样的架构设计使得 XRecode 3 能够提供强大的音频转换和处理能力,并提供直观友好的用户体验。

XRecode 3 v1.151 是一款功能强大的音频转换工具,它可以用于多种应用场景。以下是一些典型的应用场景:

1. 音频格式转换

音乐爱好者 :将音乐文件从一种格式转换为另一种格式,以便在不同的设备和播放器上播放。例如,将 FLAC 文件转换为 MP3 以便在手机上播放。播客制作 :将录制的播客音频从原始格式转换为适合发布的格式,如从 WAV 转换为 MP3。

2. 批量处理音频文件

音频库管理 :批量转换大型音频库中的文件格式,以确保所有文件统一格式,便于管理和播放。备份和归档 :将音频文件批量转换为无损格式进行备份和归档,以确保音质不受损失。

3. 提取音频

视频制作者 :从视频文件中提取音频部分进行单独的编辑和处理。例如,从 MP4 视频中提取音轨并保存为 MP3 或 WAV 文件。语言学习者 :提取教学视频中的音频内容,便于随时随地听取和复习。

4. 音频编辑和处理

音频工程师 :在转换过程中应用均衡器、压缩器等音频效果,以改善音频质量。标签编辑 :编辑音频文件的元数据(如标题、艺术家、专辑等),使音频文件信息更加完整和规范。

5. 创建兼容格式

跨平台兼容 :将音频文件转换为不同平台(如 Windows、macOS、Linux)或设备(如智能手机、平板电脑、MP3 播放器)兼容的格式。车载音频系统 :将音频文件转换为车载音响系统支持的格式,以便在驾车时播放。

6. 音频压缩

存储空间优化 :将音频文件转换为压缩格式(如从 WAV 转换为 MP3),以节省存储空间,尤其是在移动设备或云存储中。网络传输 :将音频文件压缩到较小尺寸,以便通过电子邮件或社交媒体更快地分享和传输。

7. 语言和字幕处理

翻译和配音 :将音频文件转换为不同的格式,以便在翻译和配音项目中使用。字幕制作 :提取和转换音频文件,用于生成和同步字幕文件。

8. 音频恢复和修复

旧媒体数字化 :将从旧媒介(如磁带、CD)数字化的音频文件转换为现代格式,以便于编辑和保存。音频修复 :在转换过程中对音频文件进行修复,去除噪声、提升音质。

XRecode 3 v1.151 的多功能性和强大的音频处理能力,使其适用于各种需要音频转换和处理的场景,无论是个人用途还是专业需求,都能提供高效和优质的解决方案。

更新内容或新功能:

12.06.2024

版本 1.151修复:修复了某些 WAV 文件中 ID3 标签的读取。

31.05.2024

版本 1.150修复:修复了某些多声道文件的编码。

15.05.2024

版本 1.149修复:修复了某些多声道文件的编码。

10.05.2024

版本 1.148新功能:更新到 libopus 1.5.2。

20.04.2024

版本 1.147修复:修复了对某些 DVDA iso 文件的处理。新功能:为除了 lame.exe 之外的 mp3 编码器添加了手动命令行支持。

07.04.2024

版本 1.146修复:修复了将 AIF 转换为无损格式时显示错误警告的问题。

28.03.2024

版本 1.145修复:修复了从 flac 转换为 m4a 时处理日期元数据标签的问题。修复:修复了打开某些 .wav 文件时程序冻结的问题。修复:修复了处理某些 5.0 flac 文件的问题。新功能:更新到 libopus 1.5.1。

20.02.2024

版本 1.144修复:修复了合并 mp3 文件时出现的错误。

20.02.2024

版本 1.143修复:修复了某些 flac 文件中 "album artist" 标签的处理。

01.02.2024

版本 1.142修复:修复了在不同配置文件之间切换时出现的“不允许重复”错误。

19.01.2024

版本 1.141修复:修复了小的用户界面问题。修复:在合并时保存表演者和作曲家标签。修复:修复了将某些 Flac 转换为 WMA 的问题。

03.01.2024

版本 1.140修复:修复了 lossy 到 lossless 确认对 DSD 编码源/目标文件的显示问题。修复:修复了 8 位到 8 位 flac 转码错误。修复:修复了非立体声文件的静默拆分问题。修复:修复了隐藏动态范围参数字段的问题。新功能:添加了用于指定要使用的配置文件的命令行参数 /profile。新功能:添加了将 aac 作为 M4A 输出文件扩展名的选项。

相关问答

请问怎么用foobar2000把APE转换成MP3格式 - 宇宙无敌绒绒 的...

foobar自带格式转换功能,很简单。1、在foobar文件夹看看有没有lame.exe这个文件(这就是MP3编码器),如果没有,就在网上下一个。2、在foobar中选择你...