#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;
}
pcm文件网络传输
猜你喜欢
转载自blog.csdn.net/u012323667/article/details/79331914
今日推荐
周排行