java - 如何删除声音片段?

标签 java audio wav cut audioinputstream

我创建了一个程序来分析插入输入的 file.wav。我想知道是否可以从原始 file.wav 中删除时间间隔。 我会在一定时间内剪掉分析中不必要的声音部分。消除这些声音部分后,我会得到一个新的连续声音,将所有未消除的声音融合在一起。 这是可能的? 你能帮我吗?

最佳答案

一旦您读入 WAV 格式文件、解析标题并将音频曲线数据点存放到某种数据结构中,您就有两种选择。

  • 就地更新(实现起来比较棘手)

  • 将好的数据点复制到新的数据结构中(让我们这样做)

WAV 格式的优点是它的 PCM,这意味着音频曲线表示为该曲线上的离散点。确保您已确定 header 中可用的位深度。典型的位深度为 16 位,这意味着每个样本将消耗内存缓冲区中两个字节的数据。打印出 100 个左右的样本值,以确认您手头有格式正确的样本。如果是 16 位,则可能值的范围将映射到 2^16 个不同的整数值。当您检查这些示例值时,是否已签名很重要。

作为垫脚石,我首先会编写一些代码,这些代码只需读入 WAV 文件并将每个字节复制到输出文件中。确认您可以播放这个新的输出 WAV 文件。接下来编写类似的代码,只不过这次解析 header ,识别采样率字段,将其值从 44100 更新到 22050,输出包含此更新的 header ,然后输出出现在 WAV 文件中 header 后面的音频数据字节。播放此 WAV 文件,它是否加快或减慢了音轨?

当您打开输入 WAV 文件并读取标题字节之后的每个字节时,就可以将两个字节组合成单个 16 位整数变量(如果您的标题说您有 16 位样本)。每个音频样本将消耗多个字节(8 位音频听起来很可怕)。因此,如果您有 24 位音频,那么给定 channel 中的每个音频样本当然将跨越文件的三个字节。请注意大字节序和小字节序的概念(您的两个字节是从左到右还是从右到左显示)。为简单起见,首先使用单声道输入 WAV 文件。立体声(2 channel )或 X channel 可以采用 WAV 格式,但单声道更容易。

假设我们有 10 个样本(每个样本都是 16 位整数)

  • 0 - 3 好
  • 4 - 7 个不好(我们将丢弃这些)
  • 8 - 9 良好

因此输出文件将仅包含忽略坏样本 4 - 7 后剩下的内容,因此它将只有 6 个样本。

循环所有样本 -> 识别当前样本是否良好 -> 仅将良好样本复制到输出数据结构中

int out_index = 0;

int bit_depth = 16;   // get this 16 from header, could be 24 for example

// how many bytes in bit depth, 2 if 16 bit, 3 if 24 bit
int incr_index = bit_depth / 8;

for (int in_index = 0; in_index < size; in_index += incr_index) {

    if (is_sample_good(in_index)) { //  is this sample good or bad

        output_data[out_index]     = input_data[in_index];
        output_data[out_index + 1] = input_data[in_index + 1];

        out_index += incr_index; 
    }
}

请注意,在此代码中,输入和输出数据结构都有自己的索引......这很重要,因为我们只在好的样本上提高输出索引

WAV 格式文件头始终是 WAV 文件的前 X 个字节(如果我没记错的话,是 32 个字节)。此 header 中是总数据大小的指示符。跟踪良好样本的数量,这些样本将驱动此数据长度 header 标签的值,您将把该数据长度 header 标签放入输出 WAV 文件的 header 部分。迭代输入文件并生成输出数据结构(内存缓冲区)后,打开新的输出文件,将带有更新的长度标记值的新 header 写入该文件,然后写入新的内存缓冲区,关闭文件并播放。

这里是一些WAV格式的链接

http://unusedino.de/ec64/technical/formats/wav.html

https://www.gamedev.net/resources/_/technical/game-programming/loading-a-wave-file-r709

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

http://www.topherlee.com/software/pcm-tut-wavformat.html

http://www.labbookpages.co.uk/audio/javaWavFiles.html

http://www.drdobbs.com/database/inside-the-riff-specification/184409308

关于java - 如何删除声音片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42470615/

相关文章:

html - header 与元数据相同吗?

java - maven构建的可执行Jar找不到logback.xml

java - 扩展SupportMapFragment - 如何实例化新 fragment ?

java - 傅立叶变换字节数组

bash - 使用 FFmpeg 混契约(Contract)名音频和视频文件的脚本

javascript - 播放所有浏览器和移动网络浏览器javascript的wav文件

ruby - 用于从频率生成WAV文件的Ruby API?

python - 如何将标题信息添加到 wav 文件以获得与 ffmpeg 相同的结果?

java - 如何在 Spring 启动时使用 ResponseStatusException 将错误消息显示到 Json 中?

java - 如何将 JSON 数组解析为 Android 列表