【问题标题】:Trouble implementing a real time program in C在 C 中实现实时程序时遇到问题
【发布时间】:2010-06-25 13:44:18
【问题描述】:

我有一个编码器,它对我作为输入提供的语音文件 (.wav) 进行编码。现在我想做的是编写一个程序,以便我可以在麦克风中说话,同时编码器可以处理它。基本上我想实时记录和处理语音信号(可以容忍小的延迟)。为此,我正在考虑制作一个循环,在该循环中我首先将语音记录在一个文件 say speech.in 中,例如 1 秒,然后我将此文件复制到 temp 并将此 temp 传递给编码器。与此同时,录音机应该覆盖speech.in文件并将接下来的1秒数据保存在其中。然后继续这个循环......

我遇到的问题是我无法编写程序来控制录音机做我想做的事情。是否有任何可以轻松控制的记录器或任何代码来做到这一点?

这是我能想到的唯一实现方式。也欢迎任何其他(希望更好)的解决方案。

*edit:我正在开发 Ubuntu 10.04,但我也在 Windows 上使用了相同的程序,因此欢迎在任一平台上提出任何建议

【问题讨论】:

  • 了解您正在使用的平台可能会有所帮助?
  • 通常的做法是使用系统的录音 API 来获取数据,然后将其传递给处理。正如@torak 所说,要提供更多详细信息,我们需要知道您使用的是什么平台 - Windows? Linux?苹果电脑?电话?嵌入式系统?

标签: c real-time


【解决方案1】:

您建议的方法不是要走的路。至少,这不是它在 Windows 和 Mac 上的做法。 (我不知道 linux 风格的机器会怎么做,但我猜方法是一样的)

您必须打开音频设备,并分配一组(例如 4 个)内部内存缓冲区(长度为 100 毫秒的声音就足够了,但您必须尝试获得缓冲区的大小(越小,延迟越少,但音频故障的机会就越大))。 您将这些附加到音频设备并在这些缓冲区中的任何一个被填充时请求回调。当您收到第一个回调时,请确保在音频设备再次使用第一个缓冲区并被新数据覆盖之前对缓冲区进行足够快的编码。

您可以同时将编码后的声音再次输出到音频设备。延迟将类似于 1 个缓冲区的长度。

【讨论】:

  • 好吧,我可以尝试在 Windows 上执行此操作,但我不明白分配缓冲区是什么意思。音频设备中没有固定的默认缓冲区吗?有什么命令可以改吗?
  • 我并不是说你应该使用 windows,只是解释它在我熟悉的平台上是如何工作的。我不太了解linux平台。
【解决方案2】:

这样的声音最好通过线程来解决。

这是一个 MSDN link

【讨论】:

  • 如果有问题的操作系统支持它,如果硬件没有专门针对此任务的特殊规定......
  • 线程可能有助于同时进行记录和编码,但我的主要问题仍然是如何将仍在由记录器写入的文件传递给编码器
  • 什么,为什么需要存储文件?你不能直接在内存中流式传输吗?从而避免 I/O 瓶颈?为什么投反对票?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多