- 论坛徽章:
- 0
|
最近编译过了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;
}
求各位高手指点迷津啊! |
|