免费注册 查看新帖 |

Chinaunix

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

ortp传输音频的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-20 21:14 |只看该作者 |倒序浏览
最近编译过了ortp.0.13.1
利用其中的test里的rtpsend及rtprecv两个文件来传输音频文件,结果发现在接收端那边接受完毕之后一直有一个错误:
ortp-warning-Error receiving RTCP packet: Connection refused.

一直退不出来
而且接收到的文件会比原文件大大约100k左右,不知道什么问题啊!

还请各位高手指点一下啊~

附上两个文件的源码:

1、发送 rtpsend.c

#include <ortp/ortp.h>
#include <signal.h>
#include <stdlib.h>

#ifndef _WIN32
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#endif

int runcond=1;

void stophandler(int signum)
{
        runcond=0;
}

static char *help="usage: rtpsend        filename dest_ip4addr dest_port [ --with-clockslide <value> ] [ --with-jitter <milliseconds>]\n";

int main(int argc, char *argv[])
{
        RtpSession *session;//声明一个RTP会话
        unsigned char buffer[160];//设置缓冲区
        int i;
        FILE *infile;//设置输入文件
        char *ssrc;//设置同步源
        uint32_t user_ts=0;
        int clockslide=0;//时间条
        int jitter=0;
        if (argc<4){
                printf(help);//如果输入的命令格式不正确,printf(help)
                return -1;
        }
        for(i=4;i<argc;i++){
                if (strcmp(argv,"--with-clockslide")==0){//如果有设置时间条,则采取输入的时间条
                        i++;
                        if (i>=argc) {
                                printf(help);
                                return -1;
                        }
                        clockslide=atoi(argv);
                        ortp_message("Using clockslide of %i milisecond every 50 packets.",clockslide);
                }else if (strcmp(argv,"--with-jitter")==0){
                        ortp_message("Jitter will be added to outgoing stream.");//如果有设置jitter,则采取输入的jitter
                        i++;
                        if (i>=argc) {
                                printf(help);
                                return -1;
                        }
                        jitter=atoi(argv);
                }
        }
       
        ortp_init();//初始化
        ortp_scheduler_init();//初始化scheduler
        ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
        session=rtp_session_new(RTP_SESSION_SENDONLY);        //创建一个新的rtpsession
       
        rtp_session_set_scheduling_mode(session,1);//设置一些具体的参数
        rtp_session_set_blocking_mode(session,1);
        rtp_session_set_connected_mode(session,TRUE);
        rtp_session_set_remote_addr(session,argv[2],atoi(argv[3]));//获取输入的目的主机的套接字
        rtp_session_set_payload_type(session,0);
       
        ssrc=getenv("SSRC");
        if (ssrc!=NULL) {
                printf("using SSRC=%i.\n",atoi(ssrc));
                rtp_session_set_ssrc(session,atoi(ssrc));//设置rtpsession中所使用的ssrc参数
        }
               
        #ifndef _WIN32
        infile=fopen(argv[1],"r");//打开要发送的文件
        #else
        infile=fopen(argv[1],"rb");
        #endif

        if (infile==NULL) {
                perror("Cannot open file");//若没有这个文件,则输出:cannot open file,并返回-1
                return -1;
        }

        signal(SIGINT,stophandler);//注意观察这个函数!!
        while( ((i=fread(buffer,1,160,infile))>0) && (runcond) )
        {
                rtp_session_send_with_ts(session,buffer,i,user_ts);
                user_ts+=160;
                if (clockslide!=0 && user_ts%(160*50)==0){
                        ortp_message("Clock sliding of %i miliseconds now",clockslide);
                        rtp_session_make_time_distorsion(session,clockslide);
                }
                /*this will simulate a burst of late packets */
                if (jitter && (user_ts%(8000)==0)) {
                        struct timespec pausetime, remtime;
                        ortp_message("Simulating late packets now (%i milliseconds)",jitter);
                        pausetime.tv_sec=jitter/1000;
                        pausetime.tv_nsec=(jitter%1000)*1000000;
                        while(nanosleep(&pausetime,&remtime)==-1 && errno==EINTR){
                                pausetime=remtime;
                        }
                }
        }

        fclose(infile);
        rtp_session_destroy(session);
        ortp_exit();
        ortp_global_stats_display();

        return 0;
}


2、接收  rtprecv.c

#include <ortp/ortp.h>
#include <signal.h>
#include <stdlib.h>
#ifndef _WIN32
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#endif

int cond=1;

void stop_handler(int signum)
{
        cond=0;
}

void ssrc_cb(RtpSession *session)
{
        printf("hey, the ssrc has changed !\n");
}

static char *help="usage: rtprecv  filename loc_port [--format format] [--soundcard] [--noadapt] [--with-jitter <milliseconds>]\n";

#define MULAW 0
#define ALAW 1

#if defined(__hpux) && HAVE_SYS_AUDIO_H

#include <sys/audio.h>

int sound_init(int format)
{
        int fd;
        fd=open("/dev/audio",O_WRONLY);
        if (fd<0){
                perror("Can't open /dev/audio");
                return -1;
        }
        ioctl(fd,AUDIO_RESET,0);
        ioctl(fd,AUDIO_SET_SAMPLE_RATE,8000);
        ioctl(fd,AUDIO_SET_CHANNELS,1);
        if (format==MULAW)
                ioctl(fd,AUDIO_SET_DATA_FORMAT,AUDIO_FORMAT_ULAW);
        else ioctl(fd,AUDIO_SET_DATA_FORMAT,AUDIO_FORMAT_ALAW);
        return fd;       
}
#else
int sound_init(int format)
{
        return -1;
}
#endif

int main(int argc, char*argv[])
{
        RtpSession *session;//定义rtpsession
        unsigned char buffer[160];//定义缓冲区
        int err;
        uint32_t ts=0;
        int stream_received=0;
        FILE *outfile;//定义输出文件
        int local_port;
        int have_more;
        int i;
        int format=0;
        int soundcard=0;
        int sound_fd=0;
        int jittcomp=40;
        bool_t adapt=TRUE;
       
        /* init the lib ,初始化动态库*/
        if (argc<3){
                printf(help);//若输入格式不对,打印出help
                return -1;
        }
        local_port=atoi(argv[2]);//获取输入的端口
        if (local_port<=0) {//若端口不对,打印help
                printf(help);
                return -1;
        }
        for (i=3;i<argc;i++)//该循环判断是用a律还是u律
        {
                if (strcmp(argv,"--noadapt")==0) adapt=FALSE;//判断是否adapt
                if (strcmp(argv,"--format")==0){//判断是否有设定格式
                        i++;
                        if (i<argc){
                                if (strcmp(argv,"mulaw")==0){
                                        format=MULAW;
                                }else
                                if (strcmp(argv,"alaw")==0){
                                        format=ALAW;
                                }else{
                                        printf("Unsupported format %s\n",argv);
                                        return -1;
                                }
                        }
                }
                else if (strcmp(argv,"--soundcard")==0){//判断是否有带soundcard参数
                        soundcard=1;
                }
                else if (strcmp(argv,"--with-jitter")==0){//判断是否带jitter参数
                        i++;
                        if (i<argc){
                                jittcomp=atoi(argv);
                                printf("Using a jitter buffer of %i milliseconds.\n",jittcomp);
                        }
                }
        }
       
        outfile=fopen(argv[1],"wb");//打开输出文件
        if (outfile==NULL) {
                perror("Cannot open file for writing");
                return -1;
        }
       
       
        if (soundcard){//若有带声卡,则调用输出函数,把文件输出到声卡上
                sound_fd=sound_init(format);
        }
       
        ortp_init();//初始化
        ortp_scheduler_init();
        ortp_set_log_level_mask(ORTP_DEBUG|ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);
        signal(SIGINT,stop_handler);
        session=rtp_session_new(RTP_SESSION_RECVONLY);        //初始化一个rtpsession实体
        rtp_session_set_scheduling_mode(session,1);
        rtp_session_set_blocking_mode(session,1);
        rtp_session_set_local_addr(session,"0.0.0.0",atoi(argv[2]));//设置本机的套接字
        rtp_session_set_connected_mode(session,TRUE);
        rtp_session_set_symmetric_rtp(session,TRUE);
        rtp_session_enable_adaptive_jitter_compensation(session,adapt);
        rtp_session_set_jitter_compensation(session,jittcomp);
        rtp_session_set_payload_type(session,0);
        rtp_session_signal_connect(session,"ssrc_changed",(RtpCallback)ssrc_cb,0);//注意看!!
        rtp_session_signal_connect(session,"ssrc_changed",(RtpCallback)rtp_session_reset,0);
       
        while(cond)
        {
                have_more=1;
                while (have_more){
                        err=rtp_session_recv_with_ts(session,buffer,160,ts,&have_more);
                        if (err>0) stream_received=1;
                        /* this is to avoid to write to disk some silence before the first RTP packet is returned*/       
                        if ((stream_received) && (err>0)) {
                                size_t ret = fwrite(buffer,1,err,outfile);
                                if (sound_fd>0)
                                        ret = write(sound_fd,buffer,err);
                        }
                }
                ts+=160;
                //ortp_message("Receiving packet.");
        }
       
        rtp_session_destroy(session);
        ortp_exit();
       
        ortp_global_stats_display();
       
        return 0;
}


求各位高手指点迷津啊!

论坛徽章:
0
2 [报告]
发表于 2008-01-22 09:20 |只看该作者
ortp-warning-Error receiving RTCP packet: Connection refused.
这是rtcp socket 没建立好,可以用这个函数rtp_session_set_sockets设置rtp和rtcp的socket.
文件会比原文件大大约100k左右,你打开看看是不是多了换行符了.用UltraEdit打开两个文件选择比较就可以看出两文件的差别了.

论坛徽章:
0
3 [报告]
发表于 2008-02-27 13:44 |只看该作者

回复 #2 lris 的帖子

请问,rtpsend及rtprecv 命令 你是什么输的?

论坛徽章:
0
4 [报告]
发表于 2011-04-21 22:19 |只看该作者
请问,rtpsend及rtprecv 命令 你是什么输的?
feikong0119 发表于 2008-02-27 13:44


我最近也在做这个...请问,rtpsend及rtprecv 命令 你是什么输的? 还有[ --with-clockslide <value> ] [ --with-jitter <milliseconds>] 这两个值一般设置多少? 谢谢~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP