g.711音频文件用rtp发送

yuanzhenhai 2010-07-11 11:38:51
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <memory.h>







#include <netdb.h>

#include <time.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <unistd.h> //close()



#define DEST_PORT 8888

#define DEST_IP "192.168.1.18"







typedef struct

{

/**//* byte 0 */

unsigned char csrc_len:4; /**//* expect 0 */

unsigned char extension:1; /**//* expect 1, see RTP_OP below */

unsigned char padding:1; /**//* expect 0 */

unsigned char version:2; /**//* expect 2 */

/**//* byte 1 */

unsigned char payload:7; /**//* RTP_PAYLOAD_RTSP */

unsigned char marker:1; /**//* expect 1 */

/**//* bytes 2, 3 */

unsigned short seq_no;

/**//* bytes 4-7 */

unsigned long timestamp;

/**//* bytes 8-11 */

unsigned long ssrc; /**//* stream number is used here. */

} RTP_FIXED_HEADER;





int main(int argc, char* argv[])

{

FILE *file_g711 = NULL;



int ret;

int M_bit;

M_bit = 1;



char sendbuf[1500];

memset(sendbuf,0,1500);

unsigned short seq_num = 0;



RTP_FIXED_HEADER *rtp_hdr;



int socket1;

struct sockaddr_in server;

int len = sizeof(server);

float framerate = 25;

unsigned int timestamp_increse = 0,ts_current = 0;

timestamp_increse = 160;



server.sin_family = AF_INET;

server.sin_port = htons(DEST_PORT);

server.sin_addr.s_addr = inet_addr(DEST_IP);

socket1 = socket(AF_INET,SOCK_DGRAM,0);

connect(socket1, (struct sockaddr *)&server, len) ;//申请UDP套接字



file_g711 = fopen("test.g711","rb");

if(file_g711 == NULL)

{

printf("fopen error!\n");

}

printf("g711 open successfully!\n");



while((ret = fread(&sendbuf[12],sizeof(char),512,file_g711)) > 0)

{

rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0];

//设置RTP HEADER,

rtp_hdr->payload = 0; //负载类型号,

rtp_hdr->version = 2; //版本号,此版本固定为2

if(1 == M_bit)

{

rtp_hdr->marker = 1; //标志位,由具体协议规定其值。

M_bit = 0;

printf("M_bit = 1\n");

}

else

{

rtp_hdr->marker = 0; //标志位,由具体协议规定其值。

}



rtp_hdr->ssrc = htonl(10); //随机指定为10,并且在本RTP会话中全局唯一



rtp_hdr->seq_no = htons(seq_num ++);



printf("\n\n%x\n\n",sendbuf[1]);



ts_current = ts_current+timestamp_increse;

rtp_hdr->timestamp=htonl(ts_current);



printf("calloc\n");

/**

unsigned char *Buf;

if ((Buf = (unsigned char*)calloc (512 , sizeof(char))) == NULL)

{

printf (" Could not allocate Buf memory\n");

}

Buf = &sendbuf[12];

*/

/**

ret = fread(Buf,1,511,file_g711);

if(ret<0)

{

printf("fread error\n");

}*/

//free(Buf);

printf("read data size is %d\n",ret);



printf("sizeof(sendbuf) = %d",sizeof(sendbuf));



ret = send( socket1, sendbuf, ret+12, 0 );//发送rtp包

printf("\n\n%d\n\n",ret);

if(ret<0)

{

perror("send");

break;

}



printf("**********************************\n");

printf("ret = %d\n",ret);

printf("rtp_hdr->payload = %x\n",rtp_hdr->payload);

printf("rtp_hdr->version = %x\n",rtp_hdr->version);

printf("rtp_hdr->marker = %x\n",rtp_hdr->marker);

printf("rtp_hdr->ssrc = %x\n",rtp_hdr->ssrc);

printf("rtp_hdr->seq_no = %x\n",rtp_hdr->seq_no);

printf("rtp_hdr->timestamp = %x\n",rtp_hdr->timestamp);

printf("sendbuf[0]= %x\n",sendbuf[0]);

printf("sendbuf[13]= %x\n",sendbuf[13]);

printf("**********************************\n");



usleep(500000);

memset(sendbuf,0,1500);//清空sendbuf;此时会将上次的时间戳清空,因此需要ts_current来保存上次的时间戳值

}



fclose(file_g711);

printf("end !!!!!!!!!!!!!!!!!!\n");

return 0;

}
...全文
656 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyuand 2012-05-24
  • 打赏
  • 举报
回复
1楼的
SDP文件应该是这样:
----------------
m=audio 8888 RTP/AVP 0
a=rtpmap:0 pcmu/8000/1

a=ptime:20

c=IN IP4 192.168.1.18
g711u编码的payload是0 上面两处应该保持一致
zhangyuand 2012-05-23
  • 打赏
  • 举报
回复
请问楼主是怎么解决的呢?我现在做的和你一样 就是沙沙的声音
liuyansheng0k 2011-08-26
  • 打赏
  • 举报
回复
to yuanzhenhai :
yuanzhenhai 请问你是最后怎么解决这个问题的,谢谢!
liuyansheng0k 2011-08-25
  • 打赏
  • 举报
回复
VLC可以播放G711文件
jessief 2010-07-13
  • 打赏
  • 举报
回复
用Audiochecke检测的结果也一样。前者是CDDA,后者是mpeg(要先转换成wav才能检测)。
yuanzhenhai 2010-07-13
  • 打赏
  • 举报
回复
再加上一个问题,在调试socket程序的时候,一步一步执行,但执行到 accept 函数时,它要有客户端连接时,才住下运行!!想问一下调试程序到这里后,怎么调试??
yuanzhenhai 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jessief 的回复:]

用Audiochecke检测的结果也一样。前者是CDDA,后者是mpeg(要先转换成wav才能检测)。
[/Quote]
请问一下jessief
Audiochecke检测,怎样检测?能具体说一下吗? VLC应该可以播放g711的吧?
yuanzhenhai 2010-07-11
  • 打赏
  • 举报
回复
小弟想用RTP打包发送g711u编码的音频文件!!做法如下:
用VLC找开如下的SDP文件,然后运行程序,RTP打包发送!
SDP文件如下:
----------------
m=audio 8888 RTP/AVP 0
a=rtpmap:8 pcmu/8000/1

a=ptime:20

c=IN IP4 192.168.1.18
----------------
结果:VLC有点反应,但只是沙沙的声音,没有正确解码!!
现有问题如下:
1、怀疑G711的SDP文件格式不正确,但不知G711的SDP是怎样的?
2、VLC播放时,现示位采样率为16,好像g711的位采样率是8,怎样设置VLC的位采样率??
3、g711的RTP头??我的打包如下:
V:2
P:0
X:0
CC:随便设为10
M:第一次发送时,设为1,之后就设为0
PT:0
sequence number:从0开始,增量为:160
SSRC:没设!!!
这样的设置不知道行不行??

请做过的朋友,帮解答一下小弟的困惑。。。。
budweiser 2010-07-11
  • 打赏
  • 举报
回复
不懂 帮顶

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧