linux 如何解决音频传输延迟,请高手指教,下面是我的客户端程序

这是客户端程序,服务端程序也差不多,两端可以实现音频传输,但是延迟很大,大概有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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现一个停车场模拟管理程序,可以采用队列数据结构来管理停车场内的车辆。以下是简单的 C 代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_SPACE 10 // 停车场最大容量 typedef struct car { char license[10]; // 车牌号 struct car *next; // 指向下一节点的指针 } Car; Car *head = NULL; // 停车场队列头指针 Car *tail = NULL; // 停车场队列尾指针 int count = 0; // 当前停车场内车辆数量 // 进入停车场 void in() { if (count >= MAX_SPACE) { printf("停车场已满,无法进入!\n"); return; } char license[10]; printf("输入车牌号:"); scanf("%s", license); Car *car = (Car*)malloc(sizeof(Car)); strcpy(car->license, license); car->next = NULL; if (head == NULL) { head = car; } else { tail->next = car; } tail = car; count++; printf("车辆 %s 进入停车场,当前车辆数:%d\n", license, count); } // 离开停车场 void out() { if (count <= 0) { printf("停车场内无车辆!\n"); return; } char license[10]; printf("输入车牌号:"); scanf("%s", license); Car *prev = NULL; Car *cur = head; while (cur != NULL) { if (strcmp(cur->license, license) == 0) { if (cur == head) { head = cur->next; } else if (cur == tail) { tail = prev; } else { prev->next = cur->next; } free(cur); count--; printf("车辆 %s 离开停车场,当前车辆数:%d\n", license, count); return; } prev = cur; cur = cur->next; } printf("停车场内无此车辆!\n"); } // 显示停车场内车辆信息 void show() { if (count <= 0) { printf("停车场内无车辆!\n"); return; } printf("停车场内车辆信息如下:\n"); Car *cur = head; while (cur != NULL) { printf("%s\n", cur->license); cur = cur->next; } } int main() { while (true) { printf("选择操作:\n"); printf("1. 进入停车场\n"); printf("2. 离开停车场\n"); printf("3. 显示停车场内车辆信息\n"); printf("4. 退出程序\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: in(); break; case 2: out(); break; case 3: show(); break; case 4: return 0; default: printf("输入有误,重新选择操作!\n"); break; } } } ``` 该程序采用了简单的命令行交互方式,可以通过菜单选择进入停车场、离开停车场或查看停车场内车辆信息。停车场内车辆数量达到最大容量时,无法再进入车辆;停车场内无车辆时,无法离开车辆或查看车辆信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值