• RTP封装G711源代码


    G711:8000HZ,8位,20ms一包数据 ,50包每秒

    源代码:

    // g711.c  //  
    #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  

    {  

          

        unsigned char csrc_len:4;          

        unsigned char extension:1;         

        unsigned char padding:1;           

        unsigned char version:2;           

          

        unsigned char payload:7;           

        unsigned char marker:1;            

          

        unsigned short seq_no;  

          

        unsigned  long timestamp;  

          

        unsigned long ssrc;                

    } 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! ");  

        }  

        printf("g711 open successfully! ");  

      

      

        while((ret = fread(&sendbuf[12],sizeof(char),160,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 ");  

        }  

        else  

        {  

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

        }  

      

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

      

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

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

            ts_current = ts_current+timestamp_increse;  

            rtp_hdr->timestamp=htonl(ts_current);  

            printf("calloc ");  

              

              

            //free(Buf);  

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

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

      

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

            printf(" %d ",ret);  

            if(ret<0)  

            {  

                perror("send");  

                break;  

            }  

            printf("********************************** ");  

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

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

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

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

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

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

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

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

            printf("sendbuf[12]= %x ",sendbuf[12]);  

            printf("********************************** ");  

      

            usleep(19000);  

            memset(sendbuf,0,1500); 

        }  

        fclose(file_g711);  

        printf("end !!!!!!!!!!!!!!!!!! ");  

        return 0;  

    }  

    sdp文件:

    m=audio 8888 RTP/AVP 0  

    a=rtpmap:8 pcmu/8000/1  

    a=ptime:20  

    c=IN IP4 192.168.1.18  

  • 相关阅读:
    面试题:求最大子数组的合以及起始终止位
    星级推荐,列举一下2018年购入的书籍
    Idea Live Templates
    oracle 学习随笔一: 字段大小写
    gitignore 文件生效办法
    同台服务器 部署多个tomcat 需要做的修改
    FastJson 序列化与反序列化一些说明
    记一次Log4j2日志无法输出的 心酸史
    关于.net中使用reportview所需注意
    团队作业——总结
  • 原文地址:https://www.cnblogs.com/frkang/p/3385604.html
Copyright © 2020-2023  润新知