【004_音频开发_基础篇_ALSA插件使用】

004_音频开发_基础篇_ALSA插件使用

文章目录

创作背景

学历代表过去、能力代表现在、学习力代表将来。 一个良好的学习方法是通过输出来倒逼自己输入。写博客既是对过去零散知识点的总结和复盘,也是参加了 零声教育 写博客活动。

零声教育体验课:https://xxetb.xetslk.com/s/3fbO81

本文是开发过程中的知识点总结,供大家学习交流使用,如有任何错误或不足之处,请在评论区指出。

/etc/asound.conf 示例分析

如下为我的设备的 ALSA 配置文件:

shell 复制代码
defaults.pcm.rate_converter "speexrate_medium"

pcm.!default{
    type plug
    slave.pcm "softvol"
    slave.rate 48000
    # slave.pcm both
}

ctl.!default{
    type hw
    card 0
}

pcm.softvol {
    type softvol
    # slave.pcm "rate_convert_to_48k"
    # slave.pcm "both"
    slave.pcm "dmixer_loopback"
    # slave.pcm pcm_out1_file
    control {
        name "Master"
        card 0
    }
    min_dB -32.0
    max_dB 0.0
    resolution 100
}

pcm.rate_convert_to_48k {
    type rate
    # slave.pcm "dmixer_loopback"
    slave.pcm "both"
    slave.rate 48000
    converter "speexrate_medium"
}

pcm.dmixer_loopback {
    type dmix
    ipc_key 556670
    slave {
        pcm "hw:Loopback,0,0"
        period_time 0
        period_size 1024
        buffer_size 8192
        rate 48000
        format S32_LE
    }
}

ctl.dmixer_loopback {
    type hw
    card Loopback
}

pcm.loopback_capture {
    type hw
    card Loopback
    device 1
    subdevice 0
}

pcm.audio_processing  {
    type asym
    playback.pcm "both_plug"
    capture.pcm "loopback_capture"
}

pcm.pcm_out1_file {
    type file
    slave.pcm "both"
    file "/data/pcm-%r-%c-%b-%f.wav" format "wav"
}

pcm.both_plug {
    type plug
    slave.pcm "both"
}

pcm.both {
  type route
  slave.pcm {
      type multi
      slaves {
        a.pcm "hw:0,1"
        b.pcm "hw:0,3"
        a.channels 2
        b.channels 2
      }
      bindings {
        0.slave a
        0.channel 0
        1.slave a
        1.channel 1

        2.slave b
        2.channel 0
        3.slave b
        3.channel 1
      }
  }

  ttable.0.0 1
  ttable.1.1 1

  ttable.0.2 1
  ttable.1.3 1
}

pcm.dmixer_out_i2s {
    type dmix
    ipc_key 8459
    ipc_key_add_uid true
    slave {
        pcm "hw:0,1"
        format S32_LE
    }
}

pcm.dmixer_out_spdif {
    type dmix
    ipc_key 6532
    ipc_key_add_uid true
    slave {
        pcm "hw:0,3"
        format S32_LE
    }
}

默认设备/默认控制器/plug插件

shell 复制代码
pcm.!default{
    type plug
    slave.pcm "softvol"
    slave.rate 48000
    # slave.pcm both
}

ctl.!default{
    type hw
    card 0
}
  • 第一部分定义了默认的 PCM(音频输出)设备。使用了一个插件类型为 plug 的 PCM 设备,用于对其他 PCM 设备进行包装和处理。指定了子 PCM 设备为 softvol,同时设置了音频采样率为 48000 Hz。
  • 第二部分定义了默认的控制设备。指定了控制设备的类型为硬件(hw),并将 card 设定为 0。这表示默认的控制设备将使用系统中的第一个硬件设备作为其 card。

softvol 插件

pcm.softvol {

type softvol

slave.pcm "rate_convert_to_48k"

slave.pcm "both"

slave.pcm "dmixer_loopback"

slave.pcm pcm_out1_file

control {

name "Master"

card 0

}

min_dB -32.0

max_dB 0.0

resolution 100

}

  • 定义了一个名为 softvol 的 PCM 设备。用软件音量控制的插件 softvol。
  • 注释的 # slave.pcm "rate_convert_to_48k" 把音频传入到 rate_convert_to_48k 虚拟设备,进行采样率转换(需要时使用)。
  • 注释的 # slave.pcm "both" 直接输出到 both 虚拟设备,both 再路由到 2 个物理声卡设备。
  • slave.pcm "dmixer_loopback" 输出到 loopback 虚拟声卡设备,供应用程序从 loopback 再次读出。
  • # slave.pcm pcm_out1_file 用于把音频直接写入到文件。
  • 控制设备的名称为 "Master",card 设定为 0。音量范围从 -32.0 分贝到 0.0 分贝,总共 16级,分辨率为 100(默认的设置范围为 0-255, 根据项目修改)。
  • 这个插件在系统启动后,不会马上自动创建,需要使用声卡的时候,才创建,所以在用 Master 控制音量前要先打开一下声卡。

采样率转换插件

shell 复制代码
pcm.rate_convert_to_48k {
    type rate
    # slave.pcm "dmixer_loopback"
    slave.pcm "both"
    slave.rate 48000
    converter "speexrate_medium"
}
  • 这个部分定义了一个名为 rate_convert_to_48k 的 PCM 设备,用于进行音频采样率的转换。
  • 用了一个 rate 类型的插件。设置了音频采样率为 48000 Hz,指定了转换算法为 speexrate_medium。
shell 复制代码
pcm.both {
  type route
  slave.pcm {
      type multi
      slaves {
        a.pcm "hw:0,1"
        b.pcm "hw:0,3"
        a.channels 2
        b.channels 2
      }
      bindings {
        0.slave a
        0.channel 0
        1.slave a
        1.channel 1

        2.slave b
        2.channel 0
        3.slave b
        3.channel 1
      }
  }

  ttable.0.0 1
  ttable.1.1 1

  ttable.0.2 1
  ttable.1.3 1
}

pcm.dmixer_out_i2s {
    type dmix
    ipc_key 8459
    ipc_key_add_uid true
    slave {
        pcm "hw:0,1"
        format S32_LE
    }
}

pcm.dmixer_out_spdif {
    type dmix
    ipc_key 6532
    ipc_key_add_uid true
    slave {
        pcm "hw:0,3"
        format S32_LE
    }
}

定义了一个名为 both 的 PCM 设备,它是一个路由 (route) 类型的 PCM 设备。

它的作用是将音频数据路由到2个硬件设备上。

在这个配置中,使用了一个多声道 (multi) 类型的 slave.pcm,指定了两个子 PCM 设备:hw:0,1 和 hw:0,3,分别对应着系统中的两个硬件设备。每个子 PCM 设备都配置了两个声道 (channels),分别为 2。bindings 部分定义了声道的路由关系,比如第一个声道 (0.channel) 从第一个子 PCM 设备 (a) 的第一个声道 (0.slave a) 获取音频数据,第二个声道 (1.channel) 从第一个子 PCM 设备 (a) 的第二个声道 (1.slave a) 获取音频数据,以此类推。ttable 部分定义了混音比例,例如 ttable.0.0 1 表示第一个声道的输出比例为 1。

pcm.audio_processing

shell 复制代码
pcm.audio_processing  {
    type asym
    playback.pcm "both_plug"
    capture.pcm "loopback_capture"
}

这部分定义了一个名为 audio_processing 的 PCM 设备,它是一个异步 (asym) 设备。异步设备允许单独配置播放和捕获功能。在这个配置中,设置了播放音频数据传递给 both_plug PCM 设备,即将处理后的音频数据输出到 both_plug 设备。捕获音频数据来自于 loopback_capture PCM 设备,即从 loopback_capture 设备捕获音频数据进行处理。这样可以对输入和输出音频进行分开的处理和配置。

相关推荐
YWamy13 小时前
如何降低RTC SDK在复杂网络环境下的运行成本
网络·音视频·实时音视频
FlightYe14 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
小豆庄16 小时前
本地视频打码:多模型检测、帧间追踪与18种模糊的选型
opencv·目标检测·ai·自然语言处理·音视频·视频
TST-魚爷21 小时前
小型视频会议室音频踩坑:一体化拾音扩音方案实测分享(易视讯)
stm32·电脑·音视频·钉钉·腾讯会议·zoom会议
Sayai21 小时前
让动漫角色复刻真人动作!MiniMax H3 动作控制实战:一段视频驱动角色动画(12G 显存,附模型下载)
人工智能·aigc·音视频·comfyui·动作捕捉·minimax
美狐美颜SDK开放平台1 天前
开发直播APP、电商短视频与视频社交平台时,能否共用一套美颜SDK?
android·图像处理·人工智能·音视频·直播美颜sdk
AI日报派送佬1 天前
2026年11月02日 AI 行业日报|商汤开源 Loop-9B、Pika 发布 H3 Flex 音视频模型、Meta× 傅利叶推出人形机器人 Max
人工智能·微软·开源·音视频·openai·1024程序员节·ai日报
揽秀亭长1 天前
音频、五线谱、MIDI 如何转成简谱?
人工智能·音视频
Likeadust1 天前
说开就开:临时发起的私有化音视频实时通信EasyDSS视频会议,让跨城协作不再“等排期”
网络·音视频·easydss
AI创界者1 天前
【AI生视频本地部署】最新 MiniMax-H3 全模态生成模型本地部署与极致优化:N卡 6G 显存流畅跑、无审查加速完整工作流实战
人工智能·aigc·音视频