linux中用socket双向传输声音
来源:互联网 发布:守望先锋官网数据查询 编辑:程序博客网 时间:2024/06/05 03:27
本文转载自博客:http://blog.sina.com.cn/s/blog_61e87ab50100efw3.html
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
要解决linux中音频编程的问题。linux中关于音频的API有OSS和ALSA。有的声卡是用OSS写的驱动,有的是ALSA驱动,具体还得看机器的实际情况。OSS是指opensound system,属于unix比较老的声卡驱动标准,而且是不完全开放源代码的商业产品。ALSA是指Advanced LinuxSoundArchitecture则是比较新,代表了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可能会好一些。还有,声音部分的其他功能,比如设置声音大小,选择输入源等,再用另外的程序专门来实现比较好。
- 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实现对结构体、长字符串和图片的传输
- freemark
- jQuery在线地址
- Vue 同时监视多个值得变化传给render,并在render中使用
- ArrayList深度透析
- webserver技术总结之一:webserver概念
- linux中用socket双向传输声音
- 盒子模型之商品分类列表页面
- 2、C++程序中调用Lua函数
- Spring Framework 5.0:入手Spring、IoC容器、用户数据验证案列
- 1758:二叉树
- linux内核编程
- 哈希表的应用之1:用哈希法统计大数据词频
- 【HDU】【3143】【dijkstra】【图上dp】【Speedy Escape】
- Java之DateFormatUtils格式化时间Bug-yellowcong