linux中用socket双向传输声音
来源:互联网 发布:淘宝手机端显示宝贝 编辑:程序博客网 时间:2024/05/22 03:30
要解决linux中音频编程的问题。linux中关于音频的API有OSS和ALSA。有的声卡是用OSS写的驱动,有的是ALSA驱动,具体还得看机器的实际情况。OSS是指open sound system,属于unix比较老的声卡驱动标准,而且是不完全开放源代码的商业产品。ALSA是指Advanced Linux Sound Architecture则是比较新,代表了Linux未来的主流。而且完全开放源码,他把底层的I/O操作和文件操作封装成了库的形式,开发的时候可以不用纠结在底层的细节上。当然,ALSA还是保留了和OSS兼容的内核驱动模块,也就是说,ALSA和OSS某些接口部分是完全一样的。目前我所用的板子提供的声卡驱动的接口就是和OSS兼容的,因而音频的开发用到的就是兼容的那部分。关于Linux音频编程的详细介绍参考这里。
其次,
要解决双向传输的问题。知道了socket有这样一个很好的特性后,就会觉得双向传输很简单了。我们知道,socket建立的流本身就是双工的,既可以发送又可以接收。开始时候我在想,如果对socket文件描述符进行写之,紧接着就读,会不会读到刚才写进去的数据,会不会把接收到的和要发送的数据混在一起。为了验证想法,写了个测试程序,结果发现,根本不会出现我所担心的情况。socket里发送和接收数据是完全独立的,各自有自己的缓冲区,不会出现混淆。所以,可以在服务器端和客户端对socket流进行写和读,以实现双向的传输。
代码如下:(两端完全一样)
#include
#include
#include
#include
#include
extern int quitflag;
int fwriten(int fd, void *vptr, size_t n);
int freadn(int fd, void *vptr, size_t n);
static unsigned char send_buff[256];
static unsigned char recv_buff[256];
int
audio_encdec(void* sockfd){
int *pfd=(int*)sockfd;
int fd=*pfd;
int speed = 8000;
int format = AFMT_S16_LE;
int channels = 1;
int count=256;
int nread,nwrite;
int mask;
int audio_fd;
audio_fd=open(”/dev/sound/dsp”, O_RDWR,0);
if(audio_fd==-1){
perror(”/dev/sound/dsp”);
return -1;
}
if (ioctl(audio_fd,SNDCTL_DSP_GETFMTS,&mask)==-1){
perror(”SNDCTL_DSP_GETFMTS”);
return -1;
}
if(mask&format==0){
printf(”format %d is not supported \n”,format);
return -1;
}
else if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {
perror(”SNDCTL_DSP_SETFMT”);
return -1;
}
if (ioctl(audio_fd,SNDCTL_DSP_CHANNELS,&channels)==-1){
perror(”SNDCTL_DSP_CHANNELS”);
return -1;
}
if (ioctl(audio_fd,SNDCTL_DSP_SPEED,&speed)==-1){
perror(”SNDCTL_DSP_SPEED”);
return -1;
}
while (1){
if ((nread=freadn(audio_fd,send_buff,count))==-1){
perror(”freadn”);
return -1;
}
if((nwrite=fwriten(fd,send_buff,count))==-1){
perror(”fwriten”);
return -1;
}
if ((nread=freadn(fd,recv_buff,count))==-1){
perror(”freadn”);
return -1;
}
if((nwrite=fwriten(audio_fd,recv_buff,count))==-1){
perror(”fwriten”);
return -1;
}
if(quitflag) break;
}
return 0;
}
需要说明的是,声音失真的比较厉害,把采样频率调到16000HZ可能会好一些。还有,声音部分的其他功能,比如设置声音大小,选择输入源等,再用另外的程序专门来实现比较好。
http://blog.sina.com.cn/s/blog_4da4ea3c0100q6z0.html
- linux中用socket双向传输声音
- linux中用socket双向传输声音
- linux中用socket双向传输声音
- linux中用socket双向传输声音
- Linux中用socket 传输视频
- Socket 双向传输问题
- 已解决:Linux中用socket实现视频、音频的同步传输
- 基于TCP的Socket文件双向传输
- 基于TCP的Socket文件双向传输(可并发)
- Linux socket 传输和接受结构体
- Linux下socket传输文件示例
- linux socket 传输大文件解决方案
- Linux C socket传输结构体
- 【Linux】在服务器上实现socket传输
- 通过WinSCP来进行win和linux的双向传输
- Socket 传输
- C++中用Socket实现对结构体、长字符串和图片的传输
- C++中用Socket实现对结构体、长字符串和图片的传输
- Linux中用socket 传输视频
- hdu 3465 Life is a Line
- 引用使用需要注意的总结
- 目标文件结构介绍
- vi命令参考
- linux中用socket双向传输声音
- <<c++ primer>> 指向const对象指针&const指针
- SDP会话描述协议中的参数整理
- 栈的链式存储结构与操作
- TestDept. 环境规划(笔记)
- javascript笔记-jsunit简单例子
- drupal 数据库查询
- Base64与图片互转
- 去上海