linux 如何解决音频传输延迟,请高手指教,下面是我的客户端程序
来源:互联网 发布:黄金外汇行情软件 编辑:程序博客网 时间:2024/04/27 17:27
这是客户端程序,服务端程序也差不多,两端可以实现音频传输,但是延迟很大,大概有5秒,要怎样改程序才能尽量减少延迟?????????????????
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
*/
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/soundcard.h>
#include <errno.h>
#define PORT 8888
#define SERVER_IP "192.168.1.105"
#define BUFSIZE 4096
#define RATE 8000
#define SIZE 16
#define CHANNELS 2
#define RDONLY 0
#define WRONLY 1
int read_fd; //读音频文件
int write_fd; //写音频文件
pthread_mutex_t mutex;
unsigned char write_buf[BUFSIZE];
unsigned char read_buf[BUFSIZE];
int SoundCapture(int Flag);
//接收声音
void *sound_listen(void *arg)
{
char recv_buf[BUFSIZE];
int *parg=(int *)arg;
int listen_fd=*parg;
printf("listen_fd=%d\n",listen_fd);
while(1)
{
memset(read_buf,0,1024);
int ret = recv(listen_fd, (void *)recv_buf, BUFSIZE, 0);
if(ret <= 0)
{
printf("recv sounddata error!\n");
//pthread_cancel(soundPthID2);
pthread_exit(NULL);
}
else
{
printf("recv sounddata success!\n");
}
write(write_fd, recv_buf, BUFSIZE);
//sleep(1);
}
return (void*)0;
}
//发送声音
void *sound_send(void *arg)
{
char send_buf[BUFSIZE];
int *parg=(int *)arg;
int send_fd=*parg;
printf("send_fd=%d\n",send_fd);
while(1)
{
memset(write_buf,0,1024);
read(read_fd, send_buf, BUFSIZE);
int ret = send(send_fd, (void *)send_buf, BUFSIZE, 0);
if(ret <= 0)
{
printf("send sounddata error!\n");
//pthread_cancel(soundPthID1);
pthread_exit(NULL);
}
else
printf("send sounddata success!\n");
//sleep(1);
}
return (void*)0;
}
int main(int argc,char *argv[])
{
int connect_fd;
int ret;
int i;
//int port;
int len;
static struct sockaddr_in srv_addr;
pthread_t tid_listen;
pthread_t tid_send;
//客户端运行需要给出具体的连接地址和端口
//if(argc!=3)
//{
// printf("Usage: %s server_ip_address port\n",argv[0]);
// return 1;
//}
//获得输入的端口
//port=atoi(argv[2]);
//创建套节字用于客户端的连接
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<0)
{
perror("cannot create communication socket");
return 1;
}
//填充关于服务器的套节字信息
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
//srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_addr.s_addr=inet_addr(SERVER_IP);
//srv_addr.sin_port=htons(port);
srv_addr.sin_port=htons(PORT);
//连接指定的服务器
ret=connect(connect_fd,(struct sockaddr *)&srv_addr,sizeof(srv_addr));
if(ret==-1)
{
perror("cannot connect to the server");
close(connect_fd);
return 1;
}
read_fd = SoundCapture(RDONLY); //读打开音频设备文件
if (read_fd < 0)
{
printf("Rsound device failed\n");
}
write_fd = SoundCapture(WRONLY); //写打开音频设备文件
if (write_fd < 0)
{
printf("Wsound device failed\n");
}
while(1)
{
//创建接收声音的线程
if((pthread_create(&tid_listen,NULL,sound_listen,&connect_fd))==-1)
{
perror("pthread_create error");
}
//创建发送声音的线程
if((pthread_create(&tid_send,NULL,sound_send,&connect_fd))==-1)
{
perror("pthread_create error");
}
}
close(connect_fd);
return 0;
}
int SoundCapture(int Flag)
{
int arg, status;
int fd_w;
//O_WRONLY 只读打开。O_WRONLY 只写打开。O_RDWR 读、写打开
switch(Flag)
{
case 0:
fd_w = open ( "/dev/audio" , O_RDONLY);
if (fd_w < 0)
{
printf("Ropen of /dev/audio failed\n");
return -1;
}
break;
case 1:
fd_w = open ( "/dev/audio" , O_WRONLY);
if (fd_w < 0)
{
printf("Wopen of /dev/audio failed\n");
return -1;
}
break;
default:
break;
}
arg = AFMT_S16_LE;
status = ioctl(fd_w, SNDCTL_DSP_SETFMT, &arg);
if (status == -1)
printf("SOUND_PCM_WRITE_BITS ioctl failed\n");
if (arg !=AFMT_S16_LE)
printf("unable to set sample size\n");
arg = CHANNELS;
status = ioctl(fd_w, SNDCTL_DSP_CHANNELS, &arg);
if (status == -1)
printf("SOUND_PCM_WRITE_CHANNELS ioctl failed\n");
if (arg != CHANNELS)
printf("unable to set number of channels\n");
arg = RATE;
status = ioctl(fd_w, SNDCTL_DSP_SPEED, &arg);
if (status == -1)
printf("SOUND_PCM_WRITE_WRITE ioctl failed\n");
if(arg != RATE)
printf("unable to set number of rate\n");
return fd_w;
}
- linux 如何解决音频传输延迟,请高手指教,下面是我的客户端程序
- 我写的一段"记事本"的程序,请高手指教.
- 这是上篇文章的源码?请高手指教!
- 想自己用C#写程序,主要功能是对其他的程序进行打包,如何实现,求高手指教!!!
- VXML的高手们请指教
- 请高手指教高效的Split函数
- 请高手指教。
- 请各位高手指教!
- 请高手指教!
- 请高手指教!谢谢!
- 请高手来指教
- 请高手指教
- 我的linux问题请大家指教啊(
- 我写的silverlight bing map control加载GeoServer地图的方法,请高手指教
- 下面是个程序,请高手按要求补冲程序,谢谢了!!急急!!
- 我有一个很头痛的问题,请各位高手指教!
- 今天遇到一个关于Hibernate程序的异常!请高手帮我解决下!!
- 用JAVA做万年历的初步程序,对不齐?请高手指教哦!谢谢了!
- Calendar日期的使用
- moosefs调优小记(转)
- MFC界面风格与操作系统一致
- SpringMVC接受JSON参数详解及常见错误总结(@RequestBody转载)
- “零基础学python”之python的编译和运行方法
- linux 如何解决音频传输延迟,请高手指教,下面是我的客户端程序
- ProgressDialog的简单使用
- 常用扩展路径
- 3、C++程序读取Lua的Table——1
- 南阳理工_40公约数与公倍数
- 关于上拉输入、下拉输入、模拟输入、浮空输入、推挽输出、开漏输出、复用输出的区别
- JavaWeb实例
- Hibernate二级缓存机制-类级别的get()、load()、query.list()
- 同一个页面,发出ajax请求,经过controller,返回ModelAndView,数据显示不了