当前位置: 首页 > article >正文

OpenWrt:使用ALSA实现边录边播

ALSA是Linux系统中的高级音频架构(Advanced Linux Sound Architecture)。目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的知识,详见:http://www.alsa-project.org
在内核设备驱动层,ALSA提供了alsa-driver。同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。ALSA也包括一系列实用工具如aplay(播放音频文件)、arecord(录制音频文件)、amixer(调节混音器设置)。

一.Ubuntu

在Ubuntu中,首先要确保已经安装了ALSA。可以用以下指令安装:
sudo apt-get install libasound2-dev
PS:centos 需换一个包:yum install alsa-lib-devel
安装后就可以引用libasound库了。实际上alsa-lib源码可编译出libasound.a
下面是实现代码
TestChat.cpp

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>snd_pcm_t *open_sound_dev(snd_pcm_stream_t type)
{int err;snd_pcm_t *handle;if ((err = snd_pcm_open (&handle, "default", type, 0)) < 0) {printf("open error: %s\n", snd_strerror(err));return NULL;}if ((err = snd_pcm_set_params(handle,SND_PCM_FORMAT_S16_LE,SND_PCM_ACCESS_RW_INTERLEAVED,1,16000,1,500000)) < 0) {    /* 0.5sec */printf("set params error: %s\n", snd_strerror(err));return NULL;}return handle;
}void close_sound_dev(snd_pcm_t *handle)
{snd_pcm_close (handle);
}snd_pcm_t *open_playback(void)
{return open_sound_dev(SND_PCM_STREAM_PLAYBACK);
}snd_pcm_t *open_capture(void)
{return open_sound_dev(SND_PCM_STREAM_CAPTURE);
}int main (int argc, char *argv[])
{int err;char buf[128];snd_pcm_t *playback_handle;snd_pcm_t *capture_handle;playback_handle = open_playback();if (!playback_handle){fprintf (stderr, "cannot open for playback\n");return -1;}capture_handle = open_capture();if (!capture_handle){fprintf (stderr, "cannot open for capture\n");return -1;}if ((err = snd_pcm_prepare (playback_handle)) < 0) {fprintf (stderr, "cannot prepare audio interface for use (%s)\n",snd_strerror (err));return -1;}if ((err = snd_pcm_prepare (capture_handle)) < 0) {fprintf (stderr, "cannot prepare audio interface for use (%s)\n",snd_strerror (err));return -1;}while (1) {if ((err = snd_pcm_readi (capture_handle, buf, 128)) != 128) {fprintf (stderr, "read from audio interface failed (%s)\n",snd_strerror (err));break;}if ((err = snd_pcm_writei (playback_handle, buf, 128)) != 128) {fprintf (stderr, "write to audio interface failed (%s)\n",snd_strerror (err));break;}}snd_pcm_close (playback_handle);snd_pcm_close (capture_handle);return 0;
}

编译
g++ TestCat.cpp -o TestChat -lasound

执行
./TestChat
就可以正常测试了
如果是VM虚拟机中Ubuntu,需要虚拟机列表中右键这个虚拟机,在弹出的这个快捷菜单中选择:可移动设备-》声卡-》连接,否则测试无声音。


二.OpenWrt

http://www.lryc.cn/news/2404498.html

相关文章:

  • ​链表题解——回文链表【LeetCode】
  • CSS6404L 在物联网设备中的应用优势:低功耗高可靠的存储革新与竞品对比
  • Java Stream 高级实战:并行流、自定义收集器与性能优化
  • 计算机视觉——相机标定
  • C语言中的数据类型(二)--结构体
  • 第1章:Neo4j简介与图数据库基础
  • C++11:原子操作与内存顺序:从理论到实践的无锁并发实现
  • Android第十四次面试总结
  • 动力电池点焊机:驱动电池焊接高效与可靠的核心力量|比斯特自动化
  • 【MySQL】10.事务管理
  • Bugku-CTF-Web安全最佳刷题路线
  • IT学习方法与资料分享
  • 程序代码篇---Python串口
  • jenkins gerrit-trigger插件配置
  • 虚拟主机都有哪些应用场景?
  • 预训练语言模型T5-11B的简要介绍
  • 数论总结,(模版与题解)
  • EasyRTC嵌入式音视频通信SDK助力物联网/视频物联网音视频打造全场景应用
  • 1-2 Linux-虚拟机(2025.6.7学习篇- win版本)
  • Deepseek基座:Deepseek-v2核心内容解析
  • 2025主流智能体Agent终极指南:Manus、OpenManus、MetaGPT、AutoGPT与CrewAI深度横评
  • 家政小程序开发——AI+IoT技术融合,打造“智慧家政”新物种
  • Keil开发STM32生成hex文件/bin文件
  • Windows 系统安装 Redis 详细教程
  • “组件、路由懒加载”,在 Vue3 和 React 中分别如何实现? (copy)
  • .NET 事件模式举例介绍
  • PDF 转 Markdown
  • 北大开源音频编辑模型PlayDiffusion,可实现音频局部编辑,比传统 AR 模型的效率高出 50 倍!
  • 蒲公英盒子连接问题debug
  • Unity | AmplifyShaderEditor插件基础(第五集:简易膨胀shader)