【问题标题】:ALSA - Which channel is sampled firstALSA - 先采样哪个通道
【发布时间】:2014-10-11 01:29:53
【问题描述】:

我有两个模拟音频通道(左和右)连接到 ALSA 设备,我让声卡进行采样。

结果是一个交错音频的数字流。当我尝试播放它们时会出现我的问题。一旦这些频道被交换,一旦没有。这似乎取决于首先采样的通道或播放开始的时间。

澄清我的情况:

我有三张声卡:卡 A 和 B 正在采样模拟音频,然后我通过 LAN 从每个卡 C 发送一个数字化音频通道。因此,例如我只将左声道从卡 A 发送到卡 C,同时我将右声道从卡 B 发送到卡 C。

在卡 C 上,我将这些数据包重新组合为交错流。所以我先采样(来自卡 A),然后从卡 B 采样。这样我可以像交错音频一样播放这个缓冲区。然后卡 C 正在播放此缓冲区中的数据。鉴于声卡开始向左声道播放样本,那么我应该没有问题。但有时它会交换频道,我不知道为什么。

我用 ARM 处理器控制这一切。

有没有办法可以访问 ALSA 的内部帧缓冲区,或者如何说首先播放流中的内容?

这引出了另一个问题,例如在 wav 格式中,播放器如何知道左声道的数据部分和右声道的数据部分?

【问题讨论】:

  • 录音和播放必须从第一个(左)声道开始。我的水晶球告诉我,您正在使用其中一种嵌入式设备,其硬件和驱动程序都很糟糕。
  • 奇怪的是,声卡似乎有时开始读取右声道的缓冲区,而不是左声道。 @CL - 你的 Palantir 离现实并不远,我们正在使用 CS4202-JQZ。你认为这可能是糟糕的硬件吗?
  • 什么是 AC'97 控制器?
  • @CL 我不确定你在问什么,但 AC97 是音频编解码器的标准。 CS4202 符合此标准。

标签: audio buffer alsa


【解决方案1】:

WAV 相当简单:通道以它们出现在dwChannelMask 中的 LSB 顺序存储(一个位掩码列出了所有存在的扬声器)。因此,如果位掩码为 0x3,则设置位 0 和 1,您将在 WAV 中有两个音频流:第一个是左侧(位掩码 0x1),第二个是右侧(位掩码 0x2)。如果位掩码为 0xB,则会有第三个音频流,即低音通道 (0x8)。

ALSA 是 Linux 音频,只是设计得不太好。没有像 内部 ALSA 流缓冲区这样的东西。

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2014-04-01
    • 1970-01-01
    • 2019-09-25
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多