如何将音频字节转换为样本

2023-12-02

这是我的结构

/* wave data block header */
typedef struct wavehdr_tag {
    LPSTR       lpData;                 /* pointer to locked data buffer */
    DWORD       dwBufferLength;         /* length of data buffer */
    DWORD       dwBytesRecorded;        /* used for input only */
    DWORD_PTR   dwUser;                 /* for client's use */
    DWORD       dwFlags;                /* assorted flags (see defines) */
    DWORD       dwLoops;                /* loop control counter */
    struct wavehdr_tag FAR *lpNext;     /* reserved for driver */
    DWORD_PTR   reserved;               /* reserved for driver */
} WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR;

我有这个变量WAVEHDR waveHeader;

我用麦克风录制 10 秒waveHeader->lpData有我的原始记录数据,并且waveHeader->dwBytesRecorded是原始数据的长度 现在我想计算每一秒的音量,以确定哪一秒的音量最高,哪一秒的音量最低。

我知道我应该将绝对值相加并除以样本数

I used sum += abs(waveHeader->lpData[i]);对于我从 0 到一秒数据的长度,但它没有给我一个好的结果

它总是每秒给我相同的结果,但我在某些秒中保持沉默并在某些秒中说话......

I read 我必须添加样本,而不是字节我应该如何转换waveHeader->lpData[i]到样品?

//len = length of one secs data (waveHeader->dwBytesRecorded/10)
for (int i=0; i<len; i++)
{
    sum += abs(waveHeader->lpData[i]);
}

您有用于捕获音频的 WAVEFORMATEX,对吗?如果是这样,您可以修改以下例程以满足您的需求:

void ProcessSamples(WAVEHDR* header, WAVEFORMATEX* format)
{
    BYTE* pData = (BYTE*)(header->data);
    DWORD dwNumSamples = header->dwBytesRecorded / format->nBlockAlign;

    // 16-bit stereo, the most common format
    if ((format->wBitsPerSample == 16) && (format->nChannels == 2))
    {
        for (DWORD index = 0; index < dwNumSamples; index++)
        {
            short left = *(short*)pData; pData+=2;
            short right = *(short*)pData; pData+=2;
        }
    }
    else if ((format->wBitsPerSample == 16) && (format->nChannels == 1))
    {
        for (DWORD index = 0; index < dwNumSamples; index++)
        {
            short monoSample = *(short*)pData; pData+=2;
        }
    }
    else if ((format->wBitsPerSample == 8) && (format->nChannels == 2))
    {
        // 8-bit samples are unsigned.
        // "128" is the median silent value
        // normalize to a "signed" value
        for (DWORD index = 0; index < dwNumSamples; index++)
        {
            signed char left = (*(signed char*)pData) - 128; pData += 1;
            signed char right = (*(signed char*)pData) - 128; pData += 1;
        }
    }
    else if ((format->wBitsPerSample == 8) && (format->nChannels == 1))
    {
        for (DWORD index = 0; index < dwNumSamples; index++)
        {
            signed char monosample = (*(signed char*)pData) - 128; pData += 1;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将音频字节转换为样本 的相关文章

随机推荐

  • Windows 脚本:VBScript、DOS、JS、Python、

    假设您主要是一名 C 语法程序员和 Linux 系统管理员 您的任务是在 Windows 上创建一些简单的自动化任务 监视备份文件 进程监视 您更喜欢用哪种语言编写脚本 那里有大量的 VBS 脚本 使用 VB 语法 但我更喜欢与 C 相关的
  • 切换按钮和切换可见性

    我正在使用这个 jQuery 来隐藏 DIV slider click function help slideToggle wrapper animate opacity 1 0 200 slideToggle 200 function s
  • PHP 条件语句,需要括号吗?

    我正在浏览一个论坛 有人询问他们在网上找到的一个 PHP 文件 代码中有几个这样的地方 if REMOTE ADDR ip no ip else ip getHostByAddr REMOTE ADDR 我一直认为如果条件为真 则需要括号来
  • C# float.ToString 舍入值

    也许我错过了一些东西 但是float ToString 方法对数字进行四舍五入 这让我很头痛 看看下面的小代码 当输入 12345678 作为输入时 调试器中的浮点数是正确的 但输出ToString方法是 12345680 我尝试过的任何格
  • Android Google 地图阿拉伯语标记标题显示空白

    我正在使用适用于 Android 的 Google Maps API v2 并且我已经使用过Marker类向地图片段添加标记 如下所示 map addMarker new MarkerOptions position new LatLng
  • AngularJS 搜索更改事件

    我需要一个像这样的活动 routeChangeSuccess但对于 location search 变量 我正在调用 location search newview 并且需要一种方法来知道它何时发生变化 Thanks 你应该使用 scope
  • 为什么变量名中不允许使用特殊字符?

    为什么编程语言的变量名中不允许使用特殊字符 下划线除外 是否有与计算机体系结构或组织相关的原因 大多数语言都有悠久的历史 使用 ASCII 或 EBCDIC 字符集 这些语言往往具有简单的标识符描述 例如 以 A Z 开头 后跟 A Z 0
  • 返回 Future[(Int,Int)] 而不是 (Future[Int],Future[Int])

    我有以下未来 def f1 Future 1 def f2 Future 2 我需要以下代码来返回Future Int Int val future function that returns a future future flatMap
  • 将 Object.entries 减少为泛型类型

    我在 TypeScript 中有以下函数 它的作用是将枚举转换为数组 function toKeyValList e any return Object entries e reduce acc any val any gt acc pus
  • 整理或删除 git 历史记录以进行发布? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我将公开发布一个项目 希望能找到贡献者 我的项目是另一个活跃且资源丰富的项目 Django 项目模板 的本地克隆 我没有对代码进行任何深入的更改 尽管它现在是一个不同的项目 我当前的 gi
  • WiFi Direct 设备与其他 Android 设备的连接

    我可以将支持 WiFi Direct 的设备连接到任何其他没有 WiFi Direct 功能但支持 WiFi 热点连接的设备吗 WiFi direct 是否使用专用硬件来同时存在于两台设备上 在这种情况下网络发现会起作用吗 有可能的 代码取
  • 服务不接收多媒体按钮单击事件

    我正在制作一个应用程序 当我按下多媒体按钮时 它应该执行一些操作 我知道我必须创建一个服务并捕获那里的所有事件 我执行了文档建议的所有操作 但我仍然没有在应用程序中收到单击事件 我遵循以下准则来编写类似的应用程序 https develop
  • 在 django 中,如何在更改列表视图中显示父模型数据和子模型数据?

    示例 我有一个发票作为父模型 发票详细信息作为子模型 我想在发票模型管理中显示子详细信息作为发票条目 目标是在列表页面本身中实现综合视图 有没有其他方法可以实现此目的 它应该如下所示 Invoice 1 details 1 details
  • 调试时打开文件出错

    当我尝试运行以下程序时 ConsoleApplication1 cpp Defines the entry point for the console application include stdafx h include
  • 在 WPF 中为窗口创建抽象基类

    常见的WPF架构 public partial class MainWindow Window InitializeComponent XAML
  • y 轴位于中间的多面 ggplot

    假设我有两个并排的图 具有相同的 y 轴 由以下 R 代码生成 df lt data frame x c 5 2 7 3 y c 11 3 5 6 facet c 1 1 2 2 ggplot df aes x y facet grid f
  • 动态添加控件到 ASP.NET - 20 分钟后不保留视图状态

    我们有一个动态加载控件的 ASP net 表单 IIS 6 上的 NET 3 5 我们能够保留视图状态中的值只要回发发生在 20 分钟内 数据库也得到正确更新 一切都按预期进行 但是 如果用户填写表单的时间超过 20 分钟 则控件在回发期间
  • Beautiful Soup 对现有元素返回 None

    我正在努力降低产品的价格 这是我的代码 from bs4 import BeautifulSoup as soup import requests page url https www falabella com falabella cl
  • 在“我的设置”中添加名称

    如何在 My Settings 中添加新名称 到目前为止 我已经学会了如何读取和编辑其中的值 但是如何在运行时添加另一行 名称 就像是 My Settings AddName String foo1 My Settings Save My
  • 如何将音频字节转换为样本

    这是我的结构 wave data block header typedef struct wavehdr tag LPSTR lpData pointer to locked data buffer DWORD dwBufferLength