免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1504 | 回复: 0
打印 上一主题 下一主题

udp语音通信延迟问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 09:44 |只看该作者 |倒序浏览
最近在做 Ad-Hoc 网络上的语音通信实验,实验程序分 采集--压缩--传输--接收--解码--播放 几个部分,四个线程(采集、压缩传送、接收解码、播放),采集、传输两个线程竞争一个缓冲区,接收播放竞争一个缓冲区,双向通信。


void *audio_rec(void *data)
{
    //unsigned int i;

    unsigned int reclen;
    //short recpcm[AUDIOBLK/2];

    
    while(1)
    {
        if(recbuf.len <NMAX)
        {
            pthread_mutex_lock(&rec_lock);
            reclen = Dsp_Read(devfd, recbuf.buffer+recbuf.iput, AUDIOBLK);
            //if((recbuf.iput + AUDIOBLK) >= NMAX)

            //。。。

            sem_post(&recsem);
            pthread_mutex_unlock(&rec_lock);
        }
    }
}

void *audio_send(void *data)
{
    unsigned int i;
    unsigned int nBlock = 0;
    unsigned char sendbuf[AUDIOBLK];
    unsigned int ToAddrLen = sizeof(ToAddr);

    while(1)
    {
        sem_wait(&recsem);
        pthread_mutex_lock(&rec_lock);

        nBlock = recbuf.len/AUDIOBLK;
        for(i=0; i<nBlock; i++)
        {
            MyEncode(recbuf.buffer+recbuf.iget, sendbuf, AUDIOBLK);
          

            //。。。

            sendto(sockfd, sendbuf, AUDIOBLK/2, 0, (struct sockaddr *)&ToAddr, ToAddrLen);
        }
        
        pthread_mutex_unlock(&rec_lock);
    }
}

void *audio_receive(void *data)
{
    unsigned recvLen = 0;
    unsigned char recvBuf[NMAX/2];
    int RemoteAddrLen = sizeof(RemoteAddr);

    while(1)
    {
        pthread_mutex_lock(&play_lock);
        recvLen = recvfrom(sockfd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr *)&RemoteAddr, &RemoteAddrLen);
        MyDecode(recvBuf, playbuf.buffer + playbuf.iput, recvLen);


        //。。。

        sem_post(&playsem);
        pthread_mutex_unlock(&play_lock);
    }
}

void *audio_play(void *data)
{
    unsigned int i;
    unsigned int nBlock = 0;

    while(1)
    {
        sem_wait(&playsem);
        pthread_mutex_lock(&play_lock);
        nBlock = playbuf.len/AUDIOBLK;
        for(i=0; i<nBlock; i++)
        {
            Dsp_Write(devfd, playbuf.buffer+playbuf.iget, AUDIOBLK);


            //。。。

        }
        pthread_mutex_unlock(&play_lock);
    }
}


先在pc和开发板上进行有线网络传输的测试,头痛,语音总有2s左右的延迟,接收端播放的是采集端2s前的声音。开始还怀疑是线程竞争的问题,找了很久也没找出个原因来。后来才发现是PCM设置的问题,最初采样设置是:8K,16bit,单通道,(没有设置内核音频缓冲区大小);修改44.1K,16bit,单通道, 延迟的问题就感觉不那么明显了。
分析:实验一次采集128byte,采用(8K,16bit,单通道)的话一次8ms,采用(44.1K,16bit,单通道)的话一次大约1.43ms。延迟的原因在哪里???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP