【问题标题】:Get frame count left to play in ALSA获取剩余帧数以在 ALSA 中播放
【发布时间】:2020-11-20 07:57:30
【问题描述】:

因此,在 Windows 上,我编写了一个 VOIP 程序,该程序使用 Windows 多媒体系统 (MMSystem) 并以小块(每约 30 毫秒长)记录来自麦克风的 PCM 音频,将这些数据发送给另一个用户,然后播放它到扬声器。

现在,我想使用 ALSA 在 Linux 上制作相同的程序,它似乎不像 MMSystem 那样简单。录音部分很简单,但播放的音频块之间有一些静音间隙。你看,在 MMSystem 中的工作流程很简单:

  • 添加缓冲区#1,
  • 添加缓冲区#2,
  • 播放缓冲区 #1,
  • 播放缓冲区 #2,
  • 等到缓冲区 #1 完成,
  • 添加缓冲区#1,
  • 播放缓冲区 #1,
  • 等到缓冲区 #2 完成,等等。

但是 ALSA 没有这个“等到缓冲区 #n 完成”,所以我想我可以添加 2000 帧,播放,看看还有多少帧可以播放?例如,如果一个缓冲区是 1000 帧,我可以等到剩下 那么,如何在 ALSA 中实现类似于 MMSystem 的工作流程呢?

【问题讨论】:

  • 投票结束,因为 “寻求书籍、工具、软件库等的推荐”.... StackOverflow 致力于帮助解决编程代码问题。您的 Q 可能更适合 Super User,但请阅读他们关于主题问题的帮助部分。并且请先阅读Help On-topicHelp How-to-ask,然后再在此处发布更多问题。祝你好运。

标签: c++ linux audio alsa


【解决方案1】:

MMSystem API 是为 ISA 声卡设计的(其中 DMA 缓冲区完全由 CPU 管理)。 PCI 声卡通常使用单个固定大小的环形缓冲区,这就是自 Vista 和 ALSA 以来的Windows audio APIs 所公开的内容。

您必须将缓冲区配置为足够大,以便您的几个块可以放入其中。

在任意数量的样本后无法获得通知。硬件会在每个周期结束时发送通知,因此您应该将周期大小配置为足够小。

使用 PulseAudio API 可能更容易。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多