香橙派 HDMI 播放声音踩坑记录

本文讲述了在香橙派OrangepiZero3上使用ALSA和pipewire播放声音时遇到的频率和时长异常问题,通过排查和配置ALSA解决了默认设备的问题,但pipewire依然存在问题,最终通过卸载相关软件包解决了整个问题。
摘要由CSDN通过智能技术生成

本文记录使用香橙派播放声音遇到的一个故障, 及处理过程.

目录

  • 1 故障描述
    • 1.1 版本信息
  • 2 ALSA 播放声音正常
    • 2.1 ALSA 声音播放测试
    • 2.2 配置 ALSA 默认设备
  • 3 pipewire (pulseaudio) 播放声音异常
  • 4 解决方法
  • 5 总结与展望

1 故障描述

测试设备: 香橙派 Orange pi Zero3 (内存 1GB, 处理器 全志 H618)

操作系统: Debian 12 (官方镜像, Linux 6.1)

使用 HDMI 连接显示器, 显示器有内置喇叭, 通过 HDMI 播放声音.

故障现象: 有声音, 但是播放声音的频率不对, 偏低. 播放声音的时长也不对, 正常 1 秒的音频, 可能实际上播放了 2 秒. (这个故障不太好描述, 就是播放声音的波形拉长了 )

所以播放出来的声音听起来很奇怪. 实际应用需求是使用 electronjs (chromium) 播放声音. 刚开始没太注意这个问题, 后来在测试音量功能时发现了这个故障.

1.1 版本信息

本节列出各软件包的版本, 因为更新版本的软件可能已经解决了这个故障.

系统版本:

orangepi@orangepizero3 ~> uname -a
Linux orangepizero3 6.1.31-sun50iw9 #1.0.0 SMP Mon Jul  3 13:44:03 CST 2023 aarch64 GNU/Linux
orangepi@orangepizero3 ~> neofetch
       _,met$$$$$gg.          orangepi@orangepizero3 
    ,g$$$$$$$$$$$$$$$P.       ---------------------- 
  ,g$$P"     """Y$$.".        OS: Debian GNU/Linux 12 (bookworm) aarch64 
 ,$$P'              `$$$.     Host: OrangePi Zero3 
',$$P       ,ggs.     `$$b:   Kernel: 6.1.31-sun50iw9 
`d$$'     ,$P"'   .    $$$    Uptime: 12 hours, 27 mins 
 $$P      d$'     ,    $$P    Packages: 1259 (dpkg) 
 $$:      $$.   -    ,d$$'    Shell: fish 3.6.0 
 $$;      Y$b._   _,d$P'      Resolution: 1920x1080 
 Y$$.    `.`"Y$$$$P"'         Terminal: /dev/pts/0 
 `$$b      "-.__              CPU: (4) @ 1.512GHz 
  `Y$$                        Memory: 554MiB / 981MiB 
   `Y$$.
     `$$b.                                            
       `Y$$b.                                         
          `"Y$b._
              `"""

ALSA 版本:

orangepi@orangepizero3 ~> apt search alsa | grep installed

alsa-utils/stable,now 1.2.8-1 arm64 [installed]
libasound2/stable,now 1.2.8-1+b1 arm64 [installed,automatic]
libasound2-data/stable,stable,now 1.2.8-1 all [installed,automatic]
libasound2-plugins/stable,now 1.2.7.1-1 arm64 [installed,automatic]
libatopology2/stable,now 1.2.8-1+b1 arm64 [installed,automatic]

pipewire 版本:

orangepi@orangepizero3 ~> apt search pipewire

libpipewire-0.3-0/stable 0.3.65-3 arm64
  libraries for the PipeWire multimedia server

libpipewire-0.3-common/stable,stable 0.3.65-3 all
  libraries for the PipeWire multimedia server - common files

libpipewire-0.3-dev/stable 0.3.65-3 arm64
  libraries for the PipeWire multimedia server - development

libpipewire-0.3-modules/stable 0.3.65-3 arm64
  libraries for the PipeWire multimedia server - modules

pipewire/stable,now 0.3.65-3 arm64 [residual-config]
  audio and video processing engine multimedia server

pipewire-alsa/stable 0.3.65-3 arm64
  PipeWire ALSA plugin

pipewire-audio/stable,stable 0.3.65-3 all
  recommended set of PipeWire packages for a standard audio desktop use

pipewire-audio-client-libraries/stable,stable 0.3.65-3 all
  transitional package for pipewire-alsa and pipewire-jack

pipewire-bin/stable,now 0.3.65-3 arm64 [residual-config]
  PipeWire multimedia server - programs

pipewire-pulse/stable,now 0.3.65-3 arm64 [residual-config]
  PipeWire PulseAudio daemon

wireplumber/stable,now 0.4.13-1 arm64 [residual-config]
  modular session / policy manager for PipeWire

pulseaudio 版本:

orangepi@orangepizero3 ~> apt search pulseaudio

libpulse0/stable,now 16.1+dfsg1-2+b1 arm64 [installed,automatic]
  PulseAudio client libraries

pipewire-pulse/stable,now 0.3.65-3 arm64 [residual-config]
  PipeWire PulseAudio daemon

pulseaudio-utils/stable 16.1+dfsg1-2+b1 arm64
  Command line tools for the PulseAudio sound server

electronjs 和 chromium 版本:

orangepi@orangepizero3 ~> electron --version
v28.1.2
orangepi@orangepizero3 ~> chromium --version
Chromium 119.0.6045.199 built on Debian 12.2, running on Debian 12.4

2 ALSA 播放声音正常

Linux 的声音系统混乱而复杂, 涉及到 ALSA, OSS, pulseaudio, JACK, pipewire 等. 这其中的每一个又对应一堆工具, 命令, 配置等.

OSS 是很早之前的旧的声音驱动框架, ALSA 替代了 OSS, 所以可以忽略 OSS. ALSA (高级 Linux 声音架构) 是目前 Linux 内核的声音设备驱动框架. pulseaudio 是一个声音服务器 (audio server), 可以认为是一个中介, 一个系统级的声音管理器, 一边连接着所有的声音设备, 另一边连接着所有使用声音功能 (播放声音, 录音等) 的应用程序. JACK 是一个专业用途的声音服务器, 此处没有用到, 忽略. pipewire 的目标是替代 pulseaudio, 功能类似.

可以认为, Linux 的声音软件分为 3 层:

  • (1) 设备驱动 (内核接口): ALSA, OSS (已淘汰)

    这个是最底层的软件.

  • (2) 声音服务器 (audio server): pulseaudio (正在被淘汰), JACK, pipewire

    这个是中间层.

  • (3) 应用程序: 比如 chromium (播放声音)

    这个是上层.

既然声音播放出了问题, 就一层一层的测试吧, 先从 ALSA 开始.

2.1 ALSA 声音播放测试

查看 ALSA 声音播放设备:

orangepi@orangepizero3 ~> aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: audiocodec [audiocodec], device 0: CDC PCM Codec-0 [CDC PCM Codec-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: ahubhdmi [ahubhdmi], device 0: ahub_plat-i2s-hifi i2s-hifi-0 [ahub_plat-i2s-hifi i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

此处有 2 个设备, 其中 card 0 device 0 是模拟音频输出 (3.5mm 耳机接口), card 2 device 0 是 HDMI 播放声音.

遇到问题, 先看用户手册, 香橙派的官方手册: 《OrangePi Zero3 H618 用户手册 v1.1 .pdf》
(来源: http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-Zero-3.html)

按照其中 3.12.1.2. HDMI 音频播放测试 章节描述的方法:

orangepi@orangepizero3 ~> aplay -D hw:2,0 4.wav
Playing WAVE '4.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo

嗯 ? 播放正常 ?? 这什么情况 !

orangepi@orangepizero3 ~> aplay 4.wav
Playing WAVE '4.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo

嗯, 故障又出现了. 其中 -D hw:2,0 表示指定 card 2 device 0 作为声音播放设备. 加上这个参数就正常, 不加就准确复现故障.

使用 ffmpeg 测试:

ffmpeg -i 8.ogg -f alsa hw:2,0

这个正常.

ffmpeg -i 8.ogg -f alsa default

这个就又出现故障了. 看来使用 ALSA hw:2,0 设备进行播放就是正常的, 使用 ALSA 默认设备就故障了.

使用 ffplay 测试:

SDL_AUDIODRIVER=alsa ffplay -autoexit -nodisp 8.ogg

也能复现故障.

那么, 问题就是 ALSA 默认设备配置不正确 ?

2.2 配置 ALSA 默认设备

查找了半天资料, 经过多次尝试, 终于得到了以下有效配置:

orangepi@orangepizero3 ~> cat /etc/asound.conf
defaults.pcm.!card 2
defaults.ctl.!card 2
defaults.pcm.!device 0
defaults.ctl.!device 0

pcm.!default {
  type hw
  card 2
}

ctl.!default {
  type hw
  card 2
}
orangepi@orangepizero3 ~>

重启, 然后测试:

ffmpeg -i 8.ogg -f alsa hw:2,0

这个

ffmpeg -i 8.ogg -f alsa default

这个

SDL_AUDIODRIVER=alsa ffplay -autoexit -nodisp 8.ogg

还有这个, 这下都播放正常了.

3 pipewire (pulseaudio) 播放声音异常

目前 ALSA 播放正常了, 但是 pipewire (pulseaudio) 仍然故障:

SDL_AUDIODRIVER=pulse ffplay -autoexit -nodisp 8.ogg

这个

ffplay -autoexit -nodisp 8.ogg

还有这个, 都播放不正常.

这个故障很奇怪, 但是目前能确定 ALSA 正常了, 问题就在 pipewire 这里.

但是, 这个问题怎么解决 ? 查找了半天资料, 经过多次尝试, 都无效, 无奈只能放弃.

4 解决方法

查看了关于 chromium 和 electronjs 的资料, 发现这俩软件只对 ALSA 有依赖, 并没有对 pulseaudio 有依赖.

既然 electronjs 直接使用 ALSA 播放声音, ALSA 目前又正常了, 那么实际使用 electronjs 播放声音, 为啥还是故障 ? 这奇怪的故障 !

没办法了, 把 pipewire (pulseaudio) 都卸载了吧:

orangepi@orangepizero3 ~> apt search pipewire | grep installed

确认卸载了所有 pipewire 相关的软件包.

orangepi@orangepizero3 ~> apt search pulseaudio | grep installed

libpulse0/stable,now 16.1+dfsg1-2+b1 arm64 [installed,automatic]

pulseaudio 相关的软件包只保留这一个, 别的全部卸载.

重启, 然后: 播放声音居然正常了 ! 故障居然解决了 !! 啊 ~~

5 总结与展望

实际需求是使用 electronjs 播放声音, 目前正常了, 问题已经解决了.

使用香橙派 HDMI 播放声音, 声音频率变低, 播放时间变长, 听起来很奇怪. 使用官方用户手册的方法进行测试, 播放声音正常. 使用 ALSA hw:2,0 设备播放正常, ALSA 默认设备播放故障. 通过修改 ALSA 配置文件, 使得默认设备也正常了.

但是 pipewire (pulseaudio) 播放声音仍然故障, 并且无法解决, 只能放弃. 卸载 pipewire 和 pulseaudio 相关的软件包之后, 故障消失了.

这个故障其实并没有彻底搞明白, 也就是 pipewire 为何故障, 不知道. 好在目前并不需要使用 pipewire, 凑合着用吧. 以后有时间的话, 再回来仔细研究这个故障吧.


本文使用 CC-BY-SA 4.0 许可发布.

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值