切割波形文件

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 没有文档

以上是关于切割波形文件的主要内容,如果未能解决你的问题,请参考以下文章

linux-文件切割-split&csplit

日志切割:logrotate

nginxi日志切割

linux切割、备份大的nohup日志文件

Nginx:Nginx日志切割方法

使用awk按照行数切割文件