切割波形文件
Posted
技术标签:
【中文标题】切割波形文件【英文标题】:cutting a wave file 【发布时间】:2011-09-18 16:20:54 【问题描述】:如何使用 java 剪切 .wave
文件?
我想要的是:
当用户按下标记为cut
的按钮时,它应该将音频从先前的mark
(以纳秒为单位)剪切到以纳秒为单位的当前位置。 (标记在声音被切断后以纳秒为单位定位到当前位置) 得到那段音频后,我想保存那段音频文件。
// obtain an audio stream
long mark = 0; // initially set to zero
//get the current position in nanoseconds
// after that how to proceed ?
// another method ?
我该怎么做?
【问题讨论】:
作为参考,大多数 .wav 文件是 44.1KHz,这意味着每个样本持续时间超过 2000ns。您将无法获得纳秒级精度 你做了什么来解决这个问题?您在寻找现有解决方案方面进行了哪些研究? @Asaf 你可能没看问题。你只看了标题! 【参考方案1】:Martin Dow最初回答了这个问题
import java.io.*;
import javax.sound.sampled.*;
class AudioFileProcessor
public static void main(String[] args)
copyAudio("/tmp/uke.wav", "/tmp/uke-shortened.wav", 2, 1);
public static void copyAudio(String sourceFileName, String destinationFileName, int startSecond, int secondsToCopy)
AudioInputStream inputStream = null;
AudioInputStream shortenedStream = null;
try
File file = new File(sourceFileName);
AudioFileFormat fileFormat = Audiosystem.getAudioFileFormat(file);
AudioFormat format = fileFormat.getFormat();
inputStream = AudioSystem.getAudioInputStream(file);
int bytesPerSecond = format.getFrameSize() * (int)format.getFrameRate();
inputStream.skip(startSecond * bytesPerSecond);
long framesOfAudioToCopy = secondsToCopy * (int)format.getFrameRate();
shortenedStream = new AudioInputStream(inputStream, format, framesOfAudioToCopy);
File destinationFile = new File(destinationFileName);
AudioSystem.write(shortenedStream, fileFormat.getType(), destinationFile);
catch (Exception e)
println(e);
finally
if (inputStream != null) try inputStream.close(); catch (Exception e) println(e);
if (shortenedStream != null) try shortenedStream.close(); catch (Exception e) println(e);
原回答HERE
【讨论】:
【参考方案2】: 从文件源创建一个AudioInputStream(您可以为此使用AudioSystem.getAudioInputStream(File)
)。
使用流的getFormat()
中的 AudioFormat 来确定需要从流中读取的字节数和位置。
文件位置(字节)= 时间(秒)/采样率 * 采样大小(位)* 8 * 波形文件的通道
基于原始创建一个新的AudioInputStream,它只从原始读取你想要的数据。为此,您可以跳过原始流中所需的字节,创建一个固定端点长度的包装器,然后使用 AudioSystem.getAudioInputStream(AudioFormat, AudioInputStream)。还有其他方法可以做到这一点,这可能会更好。
使用 AudioSystem.write() 方法写出新文件。
您可能还想查看Tritonus 及其 AudioOutputStream,它可能会使事情变得更容易。
【讨论】:
【参考方案3】:有一个 api 可以帮助你实现你的目标http://code.google.com/p/musicg-sound-api/
【讨论】:
此 API 没有文档以上是关于切割波形文件的主要内容,如果未能解决你的问题,请参考以下文章