如何将wav文件中的数据读取到数组

2023-12-14

我需要将 wav 文件的所有样本放入一个数组(或者两个,如果您需要这样做以保持立体声),以便我可以对它们进行一些修改。我想知道这是否容易完成(最好没有外部库)。我没有阅读声音文件的经验,所以我对这个主题了解不多。


这段代码应该可以解决问题。它将波形文件转换为标准化双精度数组(-1 到 1),但将其改为 int/short 数组应该很简单(删除/32768.0位并添加 32768 代替)。这right[]如果发现加载的 wav 文件是单声道的,数组将被设置为 null。

我不能声称它是完全防弹的(潜在的差一错误),但在创建 65536 个样本数组并创建从 -1 到 1 的波之后,没有一个样本似乎“穿过”天花板或地面。

// convert two bytes to one double in the range -1 to 1
static double bytesToDouble(byte firstByte, byte secondByte) {
    // convert two bytes to one short (little endian)
    short s = (secondByte << 8) | firstByte;
    // convert to range from -1 to (just below) 1
    return s / 32768.0;
}

// Returns left and right double arrays. 'right' will be null if sound is mono.
public void openWav(string filename, out double[] left, out double[] right)
{
    byte[] wav = File.ReadAllBytes(filename);

    // Determine if mono or stereo
    int channels = wav[22];     // Forget byte 23 as 99.999% of WAVs are 1 or 2 channels

    // Get past all the other sub chunks to get to the data subchunk:
    int pos = 12;   // First Subchunk ID from 12 to 16

    // Keep iterating until we find the data chunk (i.e. 64 61 74 61 ...... (i.e. 100 97 116 97 in decimal))
    while(!(wav[pos]==100 && wav[pos+1]==97 && wav[pos+2]==116 && wav[pos+3]==97)) {
        pos += 4;
        int chunkSize = wav[pos] + wav[pos + 1] * 256 + wav[pos + 2] * 65536 + wav[pos + 3] * 16777216;
        pos += 4 + chunkSize;
    }
    pos += 8;

    // Pos is now positioned to start of actual sound data.
    int samples = (wav.Length - pos)/2;     // 2 bytes per sample (16 bit sound mono)
    if (channels == 2) samples /= 2;        // 4 bytes per sample (16 bit stereo)

    // Allocate memory (right will be null if only mono sound)
    left = new double[samples];
    if (channels == 2) right = new double[samples];
    else right = null;

    // Write to double array/s:
    int i=0;
    while (pos < length) {
        left[i] = bytesToDouble(wav[pos], wav[pos + 1]);
        pos += 2;
        if (channels == 2) {
            right[i] = bytesToDouble(wav[pos], wav[pos + 1]);
            pos += 2;
        }
        i++;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将wav文件中的数据读取到数组 的相关文章

  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • RemoteIO 音频单元播放回调中的 AudioBufferList 内容

    我想 拦截 音频数据传送到 iOS 设备扬声器的过程 我相信这可以使用 RemoteIO 音频单元和回调来完成 在下面的playbackCallback中 ioData实际上包含任何音频数据吗 static OSStatus playbac
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Durandal.js 优化器不工作(空 main-built.js)

    我正在尝试让 Durandal js 优化器在我的测试项目上工作 但它似乎不会为 main built js 生成任何内容 我在 durandal amd 文件夹中的 node js 命令提示符下使用以下命令 optimizer exe v
  • MongoDB+Azure+Android:com.mongodb.WriteConcernException 错误:“不是主”代码:“10058”

    背景 您好 我正在 Azure 上运行 MongoDB 副本集 并已从 Android 应用程序中远程连接到它 我已经从所有实例中获得了很好的读取效果 更新 因为允许它们在主节点和辅助节点上读取 但是 写入数据库仍然会出现间歇性错误 并出现
  • 双向自我参照关联

    以 Ryan Bates 的 asciicast 为例 http asciicasts com episodes 163 self referential association 他以两个 User 关联结束 friends 逆朋友 鉴于用
  • 如何在 C# 中传递多个枚举值?

    有时 在阅读其他人的 C 代码时 我会看到一种方法在单个参数中接受多个枚举值 我一直以为它很整洁 但从未仔细研究过 好吧 现在我想我可能需要它 但不知道如何 设置方法签名以接受此方法 使用方法中的值 定义枚举 来实现这种事情 In my p
  • 在 android 中隐藏 Tablayout Bar

    我有一个活动toolbar Tablayout viewpager有碎片 像那样 I want to implement toolbar material search on all the fragments like that 但问题是
  • Android Studio 突然无法解析符号

    Android Studio 0 4 2 工作正常 今天我打开它 几乎所有内容都是红色的 并且自动完成功能已停止工作 我查看了导入 AS 似乎告诉我它找不到android support v4突然之间 为我提供了删除未使用的导入的选项 an
  • Java - 使用不带 lambda 表达式的谓词

    我有以下要求 员工 java public boolean isAdult Integer age if age gt 18 return true return false 谓词 java private Integer age Pred
  • 如何将 jQuery 插件功能限制为仅某些元素?

    我查看了 jQuery 插件网站 它教我如何编写基本插件 function fn maxHeight function var max 0 this each function max Math max max this height re
  • 合并多个精灵节点?

    例如 假设我有 2 个精灵节点 但也可以超过 2 个 如下所示 每个人都有自己独立的图像我想要的是将它们组合起来并用单个图像创建一个新的精灵节点 在工具模式下 like this 也许可以通过使用Image 毫无疑问涉及计算 或者也许使用一
  • 如何使用Python高效地在另一个字符串列表中搜索字符串列表?

    我有两个名称 字符串 列表 如下所示 executives Brian Olsavsky Some Guy Some Lady analysts Justin Post Some Dude Some Chick 我需要找到这些名称出现在如下
  • 当我使用 MKL 时,为什么 Tensorflow 会发出有关 AVX2 的警告?

    我正在使用具有 MKL 支持的 Tensorflow Anaconda 发行版 from tensorflow python framework import test util test util IsMklEnabled 这段代码打印T
  • 如何暂停和恢复 javascript 计时器 [重复]

    这个问题在这里已经有答案了 我有一个工作正常的计时器 但我需要能够暂停并在那之后恢复它 如果有人能帮助我 我将不胜感激
  • getUserMedia 在 Android Chrome 上冻结在第一帧

    我在桌面浏览器上有一个支持 getUserMedia Api 的工作代码 我可以在 div 中正确地看到网络摄像头的视频预览videoPreview 然而 当在 Android 设备上运行时 当我接受在 Chrome 浏览器中共享照片时 相
  • 在 JavaScript 中使用 JSON 将数组存储在 localStorage 中

    我已经参考了这个问题并为我工作 so q1 现在的问题是我使用 JSON stringify 和 JSON parse 将数组存储在 localStorage 中 但是 当我再次运行代码并尝试在 localStorage 上使用 JSON
  • JSF 2:未为错误页面呈现 Facelets 组合(模板)

    我在 Java EE 6 应用程序服务器 GlassFish v3 中使用 JSF 2 0 和 Facelets 我在 web xml 中配置了一个异常错误页面
  • Javascript Fullcalendar - 复制事件

    我在我的项目中使用 Fullcalendar http arshaw com fullcalendar 它通过 json 源获取事件 我想为用户提供将日历上的一个事件复制到另一天的选项 并且我想使用拖动来实现这一点 嗯 这是客户的要求 但拖
  • gmaps4rails 单标记自动缩放

    我正在尝试遵循答案here当地图上显示单个标记时缩小一点 默认情况下 我已经尝试了下面的代码 并生成了工作地图 但是更改 setZoom 没有效果 另外 我从 firebug 收到以下错误 下面的代码
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 我如何知道 `git gc --auto` 是否做了什么?

    我在跑git gc auto作为自动保存脚本的一部分 我想进行进一步的清理 如果git gc auto已经做了一些事情 但我想避免麻烦 如果git gc auto感觉不需要做某事 有没有办法检查返回值git gc auto 或者事先检查是否
  • 如何将wav文件中的数据读取到数组

    我需要将 wav 文件的所有样本放入一个数组 或者两个 如果您需要这样做以保持立体声 以便我可以对它们进行一些修改 我想知道这是否容易完成 最好没有外部库 我没有阅读声音文件的经验 所以我对这个主题了解不多 这段代码应该可以解决问题 它将波