【问题标题】:Audio manipulation and delete some part of the audio音频处理和删除部分音频
【发布时间】:2019-10-23 12:13:44
【问题描述】:

我是语音编码的新手,现在我成功地在文件中录制麦克风,并使用SaveRecordtoFile 函数将每 10 秒保存在一个文件中(这样做没有问题)

现在我想从记录的数据中删除例如 2 秒,因此我的输出将是 8 秒而不是 10 秒,在 randomTime 数组中 0 是我想要删除的秒数...

在 for 循环中,我将 waveHeader->lpData 的数据复制到新缓冲区 if (randomTime[i] == '1')

这似乎是一个真正的算法,应该可以工作,但问题是输出,一些输出很好(大约 70% 或更多),但其中一些已损坏

我认为我的代码有错误,但我调试这段代码几天,我不明白问题是什么?

而且我 70% 或更多的输出都很好,我认为这不是因为字节或样本

【问题讨论】:

  • 您发布的代码中哪里有C++?看起来都是C。其次,您是否需要发布所有这些代码来展示如何从数组中“擦除”一个项目?有效的方法是仅在循环中将要擦除的项目交换到数组的末尾,并且在循环之后,只需调用 memcpy 即可“擦除”已换出的项目(这就是 std::remove_if 在 C++ 中的工作方式) .您的尝试是在循环中重复调用 mempy,这是非常低效的。对于每次迭代,您都在移动整个块来掩盖漏洞,这不是一个好方法,即使它可能“工作”。
  • @PaulMcKenzie 1:我需要展示如何记录数据,2:每次我发布部分代码时,都会有人像您一样发布完整代码 3:我知道解决方案可以不依赖于 C 或 C++,所以每个人都知道 C 或 C++ 可以帮助它4:感谢您的回答,但我不明白您的解决方案,请您解释一下吗?
  • 您可以发布完整的代码,但要展示您想要完成的概念。这与音频文件有什么关系?这似乎是一个非常普遍的问题,可以归结为“当......时如何从数组中删除项目”。数组是否由音频数据、文件数据、小部件数组等组成并不重要。至于我的解决方案,这只是基本算法。您有一个包含 N 个项目的数组,并且您希望以一种有效(且安全)的方式删除符合特定条件的项目。希望您看到循环中的 memcpy 是一种天真的方法。
  • @PaulMcKenzie 我知道问题是在循环中反复调用 mempy ,但我不明白你的有效方法,我不明白如何交换项目,它如何帮助解决我的问题,我没有做这样的事情swap the items to erase to the end of the array in the loop, and after the loop, just one call to memcpy to "erase" the swapped out items
  • @PaulMcKenzie 你能给我一个示例代码来帮助我实现你的解决方案吗?或将此代码作为答案发布

标签: c++ c voice voice-recording winmm


【解决方案1】:

您的代码可以将样本分开,之后流不同步并且您会听到很大的噪音。

它是如何发生的?您的样本大小是 4 个字节。所以你绝不能复制任何不是 4 的倍数的东西。10 秒的音频将占用 10x48000×4=1920000 字节。但是Sleep(10000) 将始终接近 10 秒,但不完全是 10 秒。所以你可以获得 1920012 个字节。然后你做:

dwSamplePerSec = waveHeader->dwBytesRecorded / 10; // 10 Secs

返回 192001(不是 4 的倍数)并且蒸汽不​​同步。如果你很幸运,你会在 10 秒内收到 1920040 字节,并且在除以 10 后仍然是 4 的倍数,你就可以了。

【讨论】:

  • 谢谢你,你是最棒的,我希望我能给你的答案投票 100 次。
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多