pcm文件网络传输


#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#include "rtpsourcedata.h"
#include "jthread.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>


using namespace jthread;
using namespace jrtplib;

void decode(short *dst,const unsigned char *src, size_t len)
{
    for(size_t i=0; i < len  ; i++)
    {
        unsigned char alaw = *src++;
        alaw ^= 0xD5;
        int sign = alaw & 0x80;
        int exponent = (alaw & 0x70) >> 4;
        int data = alaw & 0x0f;
        data <<= 4;
        data += 8;   //丢失的a 写1
        if(exponent != 0)  //将wxyz前面的1补上
            data += 0x100;
        if(exponent > 1)
            data <<= (exponent - 1);

        *dst++ = (short)(sign == 0 ? data : -data);

    }
} 

#include "JRTPSession.h"
#include "PCMPlayer.h"

using namespace ScheduleServer;

void on_recv_rtp_packet(const unsigned char* data, const unsigned long& length,
                        const unsigned short& sequence, const unsigned long& timestamp,
                        const unsigned long& ssrc, const unsigned char&payload_type, const bool& mark)
{
    std::cout << "Got packet at " << timestamp << " from SSRC " << ssrc << " length " << length << " sequence " << sequence << std::endl;
  //  std::cout << "Data " << data << std::endl;
 //encode  make unsigned char change to short 
    short* rec = (short*) malloc(sizeof(short) * 480);
    decode(rec,data,480);  
    ScheduleServer::CPCMPlayer player;
    player.play(rec);
    free(rec);
}

#include <alsa/asoundlib.h>

#define MAX  (32635)   
void encode(unsigned char *dst, short *src, size_t len)
{ 
   for(int i = 0; i < len ; i++)
    {

 //      *dst++ =  *src++;
        short pcm  = *src++;
        int sign = (pcm & 0x8000) >> 8;
        if(sign != 0)
            pcm = -pcm;
        if(pcm > MAX)   pcm = MAX;
        int exponent = 7;
        int expMask;
        for(expMask = 0x4000; (pcm & expMask) == 0 && exponent >0; exponent--,expMask >>= 1){}
        int mantissa = (pcm >> ((exponent == 0) ? 4 : (exponent + 3))) & 0x0f;
        unsigned char alaw = (unsigned char)(sign | exponent << 4 | mantissa);
        *dst++ = (unsigned char)(alaw ^0xD5);   
    }     
} 




int main(int argc, char **argv)
{
    CRTPRecvSession rtp_recv_session(8888);   
    rtp_recv_session.set_rtp_callback(on_recv_rtp_packet);
    rtp_recv_session.add_dest_addr("127.0.0.1", 8888);

    std::string filename = "3.pcm";
    FILE* file = fopen(filename.c_str(), "rb");

    short* frame = (short*) malloc(sizeof(short) * 480);
    unsigned char * data = (unsigned char *) malloc(sizeof(unsigned char) * 480);

    while (true)
    {
        {
            size_t read_len = fread(frame, sizeof(short), 480, file);
            if(480 != read_len)
            {
                fseek(file, 0, SEEK_SET);
                //break;
            }
            //std::cout << "play " << read_len << std::endl;
            //encode make short change to unsigned char
            encode(data,frame,read_len);  //then send data


        }
 //       decode(zz,data,480);
 //      ScheduleServer::CPCMPlayer player;
 //      player.play(zz);
            //rtp_recv_session.send_rtp_packet((const unsigned char*)"1234567890",10);
            //rtp_recv_session.add_rtp_header(temp, 20, 1, true, 1, clock(), 1);

            rtp_recv_session.send_rtp_packet(data, 480, 1, true, 10, 1);

   //         RTPTime::Wait(RTPTime(1,0));
    }

    free(frame);
    free(data);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u012323667/article/details/79331914