linux 音频文件播放文件管理,linux dsp 播放音频文件
#include
#include
#include
#include
#include
#include
#include
/* 下面的三个参数是跟具体文件相关
* cmd: file 音频文件
* [file pass.wav] =>> pass.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 44100 Hz
* 1. 16位
* 2. mono为当声道=1, Stereo为立体声=2
* 3. 44100HZ为频率这个大家都知道,及一秒钟采集或者播放音频的bit数量。
*/
#define RATE 44100
#define SIZE 16
#define CHANNELS 1 // 1表示单声道,2为立体/* 缓冲区 */
unsigned char buff[RATE * SIZE * CHANNELS / 8]; //buff里面正好放一秒钟的音频
int main()
{
int fd;
int wavfd; /* wav文件的描述符 */
int arg; /* ioctl参数 */
int ret; /* 返回值 */
/* 打开dsp音频设备 */
fd = open("/dev/dsp", O_WRONLY);
if (fd < 0) {
printf("open of /dev/dsp failed");
exit(1);
}
wavfd = open("pass.wav",O_RDONLY);
if (wavfd < 0) {
printf("open of wav failed");
close(fd);
exit(1);
}
/* 设置bit */
arg = SIZE;
ret = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (ret == -1)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size");
/* 设置channels */
arg = CHANNELS;
ret = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (ret == -1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels");
/* 设置rate */
arg = RATE;
ret = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (ret == -1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed");
/* 从wav文件中读buff大小的内容,然后写入/dev/dsp中,直到文件结束 */
/* Q:这里我试验时播放了两次,不知道啥情况,如果大家也遇到了请指教。*/
while ((ret = read(wavfd, buff, sizeof(buff))) > 0) {
//printf("read size = %d\n", ret);
write(fd, buff, sizeof(buff));
/* 下面的代码用于在更改播放文件的参数时,播放掉缓冲区内的内容 */
ret = ioctl(fd, SOUND_PCM_SYNC, 0);
if (ret == -1)
perror("SOUND_PCM_SYNC ioctl failed");
}
close(fd);
close(wavfd);
}
下面是封装的接口可以直接拿过来使用:
void play_audio(int rate, int bits, int channels, char *filename)
{
int fd;
int wavfd; /* wav文件的描述符 */
int arg; /* ioctl arg */
int ret; /* return value */
unsigned char buff[rate * bits * channels / 8]; //buff里面正好放一秒钟的音频
/* open device */
fd = open("/dev/dsp", O_WRONLY);
if (fd < 0) {
printf("open of /dev/dsp failed");
exit(1);
}
wavfd = open(filename, O_RDONLY);
if (wavfd < 0) {
printf("open of wav failed");
close(fd);
exit(1);
}
/* set bits */
arg = bits;
ret = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (ret == -1)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size");
/* set channels */
arg = channels;
ret = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (ret == -1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels");
/* set rate */
arg = rate;
ret = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (ret == -1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed");
/* 从wav文件中读buff大小的内容,然后写入/dev/dsp中,直到文件结束 */
while ((ret = read(wavfd, buff, sizeof(buff))) > 0) {
printf("read size = %d\n", ret);
write(fd, buff, sizeof(buff));
/* 下面的代码用于在更改播放文件的参数时,播放掉缓冲区内的内容 */
ret = ioctl(fd, SOUND_PCM_SYNC, 0);
if (ret == -1)
perror("SOUND_PCM_SYNC ioctl failed");
}
close(fd);
close(wavfd);
}
linux 音频文件播放文件管理,linux dsp 播放音频文件相关推荐
- Linux下 用cmp工具备份,Linux常用命令梳理——文件管理(一)
由于本人目前仍是萌新一枚,所以<Linux常用命令梳理>系列仅依照个人目前掌握的知识,对一部分命令进行梳理,目的是为了对之前学到的知识进行巩固.当然了,如果机缘巧合被大家看到了,也欢迎各位 ...
- linux中的ul命令,linux lin命令
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...
- java 上传mp3文件大小,Java获取音频文件(MP3)的播放时长
最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐. 这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件. 方案一:Java的方式 找第三方的库,真的感谢这些提供j ...
- linux一键电影网站脚本,Linux下HTML5播放器一键生成脚本
原创内容,转载请注明出处: https://www.myzhenai.com.cn/post/2394.html https://www.myzhenai.com/thread-17969-1-1.h ...
- linux系统万能播放器下载,360万能播放器Linux版
360万能播放器Linux版是一款十分不错的播放器,它可以帮助用户轻松播放出各种格式的音视频文件,所以喜欢看视频的用户,快来下载试试吧! 软件介绍 360万能播放器Linux版是一款在Linux系统上 ...
- linux安装音乐软件教程,Linux上好用的五款音乐播放器
Jack Wallen 盘点他***的五款 Linux 音乐播放器. 不管你做什么,你都有时会来一点背景音乐.不管你是开发.运维或是一个典型的电脑用户,享受美妙的音乐都可能是你在电脑上最想做的事情之一 ...
- Linux|智能家居嵌入式系统之音乐播放
嵌入式实验 引语 内容介绍 案例展示 原理 代码 结果展示 引语 记录学习路程,抛砖引玉.如有更好的算法或者出现错误,欢迎指点. 内容介绍 1.理解触摸屏的工作原理 2.掌握触摸屏获取坐标的方法 3. ...
- linux终端音乐播放器,Linux终端音乐播放器cmus攻略: 操作歌单
cmus是一款开源的终端音乐播放器.它小巧快速,而又功能强大.cmus支持Ogg/Vorbis.MP3.FLAC.Musepack.WavPack.WMA.WAV.AAC.MP4等格式,包含Gaple ...
- 如何安装整个linux系统中所需要的mp3播放库插件? 可以在安装rpmfusion仓库后直接通过dnf install进行按照就可以了...
在vi的界面中, 前面的数字, 表示一行. 而对于中文而言, 并不一定是"一个文本行"就是一行, 而是以 回车(硬回车)为标志, 来判定一行的. 而dd, yy等也是以" ...
最新文章
- java培训分享:学习Java需要什么软件
- 前端用html5还是html4,Web前端面试题第四道—Html5与html4的异同
- 要有被打断仍能够继续学习的能力
- Java连接open fire_java – 为什么我不能连接到openfire服务器?
- 有向图最长路径算法_算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法...
- id和instancetype的区别
- Kafka的配置文件详细描述
- Web安全通讯之JWT的Java实现
- 教你如何从0到1实现组件化架构
- R语言do.call函数简单说明
- java8 32位脱机安装_java8离线安装包32位 官方最新版
- 将微信数据提取为exel表格(2022年版)免root 保姆级教程
- https 抓包解密
- 【Dart语言第5篇】运算符
- C# Revit二次开发基础/核心编程---建筑建模-标高和轴网
- 无线路由器不启用dhcp服务器,360路由器怎么关闭DHCP服务器? | 192路由网
- python学习第五节:用面向对象实现friendbook
- 物流企业竞争优势及竞争力体系的构建 (zt)
- 说说自己理解的web架构
- 设计灵感|极简优雅排版!干净简洁的排版设计
热门文章
- 如何通过OpenFace实现人脸识别框架
- 最简单的React和Redux整合的例子
- Scala _04Scala字符串
- leetcode 334. Increasing Triplet Subsequence | 334. 递增的三元子序列(一种较trick的解法)
- leetcode 274, 275. H-Index I, II(H 指数问题合集,线性查找/二分查找)
- javascript中的模块系统
- JDK14性能管理工具:jstack使用介绍
- Kafka单机、集群模式安装详解(一)
- package.json mysql_package.json入门
- PooledDirectByteBuf源码分析