在以前没有毕业之前,做过了一个了播放器,其实就是mplayer的二次开发。

如果在这个播放器之上,加个oss作声音输入,那不就可以做个卡拉OK啦?

1.OSS的定义

OSS(Open Sound System,开放声音系统),是unix或类unix环境中的音频接口(录音、放音、采样率等的设置),也被称为是一种音频驱动结构。只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。

2.基础知识

数字音频设备(有时也称codec,PCM,DSP,ADC/DAC设备):播放或录制数字化的声音。它的指标主要有:采样速率(电话为8K,DVD为96K)、channel数目(单声

道,立体声)、采样分辨率(8-bit,16-bit)。

mixer(混频器):用来控制多个输入、输出的音量,也控制输入(microphone,line-in,CD)之间的切换。

synthesizer(合成器):通过一些预先定义好的波形来合成声音,有时用在游戏中声音效果的产生。

MIDI 接口:MIDI接口是为了连接舞台上的synthesizer、键盘、道具、灯光控制器的一种串行接口。

在Unix系统中,所有的设备都被统一成文件,通过对文件的访问方式(首先open,然后read/write,同时可以使用ioctl读取/设置参数,最后close)来访问设备。在OSS中,主

要有以下的几种设备文件:

* /dev/mixer:访问声卡中内置的mixer,调整音量大小,选择音源。

* /dev/sndstat:测试声卡,执行cat /dev/sndstat会显示声卡驱动的信息。

* /dev/dsp 、/dev/dspW、/dev/audio:读这个设备就相当于录音,写这个设备就相当于放音。/dev/dsp与/dev/audio之间的区别在于采样的编码不同,/dev/audio使用μ律编

码,/dev/dsp使用8-bit(无符号)线性编码,/dev/dspW使用16-bit(有符号)线形编码。/dev/audio主要是为了与SunOS兼容,所以尽量不要使用。

* l /dev/sequencer:访问声卡内置的,或者连接在MIDI接口的synthesizer

3.音频编程

OSS为音频编程提供三种设备,分别是/dev/dsp,/dev/dspW和/dev/audio,前面已经提到了它们之间的区别。

用户可以直接使用Unix的命令来放音和录音,命令cat /dev/dsp >xyz可用来录音,录音的结果放在xyz文件中;命令cat xyz >/dev/dsp播放声音文件xyz。

如果通过编程的方式来使用这些设备,那么Unix平台通过文件系统提供了统一的访问接口。程序员可以通过文件的操作函数直接控制这些设备,这些操作函数包括:open、

close、read、write、ioctl等。下面我们就分别讨论打开音频设备、放音、录音和参数调整。

4.音频录放框架

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h> #define LEN 3 /* 存储秒数 */
#define RATE 8000 /* 采样频率 */
#define SIZE 8 /* 量化位数 */
#define CHANNELS 1 /* 声道数目 */ /* 用于保存数字音频数据的内存缓冲区 */
unsigned char buf[LEN*RATE*SIZE*CHANNELS/8]; int main()
{
int fd; /* 声音设备的文件描述符 */
int arg; /* 用于ioctl调用的参数 */
int status; /* 系统调用的返回值 */ /* 打开声音设备 */
fd = open("/dev/dsp", O_RDWR);
if (fd < 0)
{
perror("open of /dev/dsp failed");
exit(1);
} /* 设置采样时的量化位数 */
arg = SIZE;
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg); if (status == - 1)
perror("SOUND_PCM_WRITE_BITS ioctl failed"); if (arg != SIZE)
perror("unable to set sample size"); /* 设置采样时的通道数目 */
arg = CHANNELS; status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg); if (status == - 1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed"); if (arg != CHANNELS)
perror("unable to set number of channels"); /* 设置采样率 */
arg = RATE; status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg); if (status == - 1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed"); /* 循环,直到按下Control-C */
while (1)
{
printf("Say something:\n");
status = read(fd, buf, sizeof(buf)); /* 录音 */ if (status != sizeof(buf))
perror("read wrong number of bytes"); printf("You said:\n");
status = write(fd, buf, sizeof(buf)); /* 放音 */ if (status != sizeof(buf))
perror("wrote wrong number of bytes"); /* 在继续录音前等待放音结束 */
status = ioctl(fd, SOUND_PCM_SYNC, 0); if (status == - 1)
perror("SOUND_PCM_SYNC ioctl failed");
}
}

不知道为什么,录音的声音在虚拟机上变成了滴答声,这个有代考究。

总结:

利用oss,加入播放器,配以字幕,一个卡拉OK软件就这样了。

参考资料:

Mr.Right的专栏:http://blog.csdn.net/lanmanck/article/details/5818723

OSS研究的更多相关文章

  1. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  2. 开个坑, 写个阿里云开放储存服务(OSS)的C++版SDK以及客户端

    这应该是继我研究手册QQ协议后的第2个稍微正式一点的网络程序, 不只是Scoket套接字编程, 还涉及到更多的HTTP协议知识! 阿里云开放储存服务OSS官方已经提供了不少SDK, 包括PHP/Pyt ...

  3. laravel下使用阿里云oss上传图片

    对小公司而言,使用阿里云oss比直接买硬盘要划算的多,不管从存储性价比上还是从网速负载上.最近因为公司的项目有比较大的图片存储访问需求,所以决定使用阿里云的oss. 在研究了一下以后,摆着不自己造轮子 ...

  4. 3GP文件格式研究

    需要看的文档 http://www.3gpp.org/ftp/Specs/archive/26_series/ 3GPP TS 26.233 3GPP TS 26.243 3GPP TS 26.244 ...

  5. 完成OSS.Http底层HttpClient重构封装 支持标准库

    OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力.由于OSS.Http类库是几年前我参照RestSharp的思路,完 ...

  6. jeesz分布式架构集成阿里云oss存储

      1. 服务接口定义 /**  * 文件上传  1:头像 2:显示图片 3:个人封面  :4:基础图片   * @param request  * @param response  * @param ...

  7. Linux C OSS音频编程

    在linux下也可以写一个类似麦克风和喇叭这样的应用程序,只要打开/dev/dsp这个设备驱动,对该设备read读操作相当于录音,对这个设备write写操作相当于放音. 对于以下出现的一些参数我就不多 ...

  8. BDD框架之Cucumber研究

    BDD框架之Cucumber研究 引用链接:http://kongqingyun123.blog.163.com/blog/static/6377283520134158437813/ Cucumbe ...

  9. .Net程序测试阿里云OSS开放存储服务

    阿里云官网有提供OSS相关的操作API文档和.Net程序的 SDK,也可以在这里下载OSS相关文件 但是API文档里面的都是通过http请求和响应的消息来描述如何操作OSS的 而一般在程序中需要的是O ...

随机推荐

  1. MySQL解压版安装配置详解

    MySQL解压版安装起来比较简单,步骤相对较少.下面我们就来详细介绍一下如何在windows操作系统上安装解压班的MySQL. 1.下载解压版MySQL,地址:http://downloads.mys ...

  2. java编写一个端口扫描器

    好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简 ...

  3. mysql merge表介绍

    在Mysql数据库中,Mysql Merge表有点类似于视图.下面就让我们来一起了解一下Mysql Merge表都有哪些优点,希望对您能有所帮助. Mysql Merge表的优点: A: 分离静态的和 ...

  4. IOS 高级开发 runtime(二)

    二.移魂大法 使用runtime还可以交换两个函数.先贴上代码和执行结果. #import <Foundation/Foundation.h> @interface DZLPerson : ...

  5. JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

    1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...

  6. scrapy, 自带命令行调用工具.

    #-*- coding:utf-8 -*- from scrapy import cmdline cmdline.execute("scrapy crawl dmoz".split ...

  7. CF Round#240题解

    第一次参加CF的比赛,MSK19.30,四个小时的时差真心累,第一次CODE到这么夜-- 一开始做了A,C两题,后来做B题的时候我体力和精神集中度就很低了,导致一直WA在4-- 今天起床后再刷B,终于 ...

  8. 【BZOJ3270】【高斯消元】博物馆

    Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...

  9. open()函数

    STDOUT_FILENO            1 标准输入 STDIN_FILENO             0 标准输出 STDERR_FILENO         2 标准错误 在/proc目 ...

  10. 学习JS

    原型是Js中非常重要的概念,每个函数(在Js里面函数也是对象)都有一个叫prototype即原型)的属性,不过在一般情况下它的值都是null,但它他有一项非常重要的功能就是所以实例都会共享它里面的属性 ...