1.移植 jrtplib-3.11.2.tar.gz 和 jthread-1.3.3.tar.gz在主目录创建文件夹install
lwp@lwp-virtual-machine:~/jz/rtp_audio$ ls
a.sh install jrtplib-3.11.2 jrtplib-3.11.2.tar.gz jthread-1.3.3 jthread-1.3.3.tar.gz
lwp@lwp-virtual-machine:~/jz/rtp_audio$
2.进入jthread-1.3.3 执行 a.sh 编译生成静态库
lwp@lwp-virtual-machine:~/jz/rtp_audio/jthread-1.3.3$ cat a.sh
#!/bin/bash
cmake CMakeLists.txt
#cmake -DCMAKE_INSTALL_PREFIX=/home/lwp/jz/rtp_audio/install CMakeLists.txt#set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_C_COMPILER mips-linux-gnu-gcc)
#set(CMAKE_CXX_COMPILER mips-linux-gnu-g++)
#set(CMAKE_INSTALL_PREFIX "/home/lwp/jz/rtp_audio/install")
3.进入jrtplib-3.11.2 执行a.sh编译生成静态库
lwp@lwp-virtual-machine:~/jz/rtp_audio/jrtplib-3.11.2$ cat a.sh
#!/bin/bash
cmake -DCMAKE_INSTALL_PREFIX=/home/lwp/jz/rtp_audio/install CMakeLists.txt#set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_C_COMPILER mips-linux-gnu-gcc)
#set(CMAKE_CXX_COMPILER mips-linux-gnu-g++)
#set(CMAKE_INSTALL_PREFIX "/home/lwp/jz/rtp_audio/install")
4.编程c++函数,亲测gcc无法编译通过,g++编译没问题,t我这边使用的是君正板子,交叉编译环境mips-linux-gnu-g++和mips-linux-gnu-gcc
5.编程代码测试,我这边读取君正板子有个麦克风采集,所以音频在fifo中读取,你们测试建议读取文件就可以了,.h代码木有东西,自己写makefile运行了,这个提供参考
CROSS_COMPILE ?= mips-linux-gnu-
CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)g++
LD = $(CROSS_COMPILE)ld
AR = $(CROSS_COMPILE)ar cr
STRIP = $(CROSS_COMPILE)strip
RTP_LIB=./lib/libjrtp.a ./lib/libjthread.a
RTP_INCLUDE=-I./include/jrtplib3 -I./include -I./include/jthread -I./audio_rtp_send/G711RtpSend.h
LDFLAG = -O2 -w -march= -lpthread -lm -lrt -ldl -lstdc++ -std=c++11
CFLAGS =-DxDEBUG
CPPFLAGS=-DxDEBUG
CPPSRCS:=$(wildcard ./audio_rtp_send/*.cpp) #.cpp文件目录
CPPOBJS:=$(CPPSRCS:.cpp=.o)
$(CPPOBJS) : %.o: %.cpp
$(CPP) -c $< -o $@ $(RTP_INCLUDE) $(CPPFLAGS) -std=c++11
$(TARGET):$(COBJS) $(CPPOBJS)
$(CC) -o $(TARGET) $(LDFLAG) $(COBJS) $(CPPOBJS) $(LIBS) $(RTP_LIB) $(CFLAGS)
6.rtp send 测试代码
#include <rtpsession.h>
#include <rtpudpv4transmitter.h>
#include <rtpipv4address.h>
#include <rtpsessionparams.h>
#include <rtperrors.h>
#include <rtplibraryversion.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "mp4v2.h"
/*
RTP发送G711音频给VLC播放断断续续
断断续续时的配置:
sdp文件中a=ptime:20 也就是20ms播放一个rtp包
程序中:8000*20ms=160B 也就是每个rtp包中的音频数据大小为160B 时间戳增量为160
修改:
sdp文件中a=framerate::25 也就是1s播放25个rtp包 相当于一个rtp包播放40ms
程序中:8000*40ms=320B 也就是每个rtp包中的音频数据大小为320B 时间戳增量为320
播放效果良好
总结:
可能原因1.发送的每个包中的数据量太小,导致vlc播放速度大于了收到包的速度,停止发送vlc立即停止播音;修改后播放良好,但是停止发送时要过一段时间VLC才停止播音,证明有很多的数据在缓存中等待播音,所以不断断续续的了
*/
using namespace jrtplib;
uint16_t iLocalPort = 6666;
uint16_t iDestPort = 12000;
uint8_t szDestAddr[]={192, 168, 22, 101};//修改目标地址,就是你电脑地址啦
FILE *pG711File = NULL;
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
void rtpPrintf(uint8_t *buf, uint16_t len)
{
uint16_t i=0;
printf("RTP len=%d : \n", len);
for(i=0; i<len; i++)
{
printf(" %02X", buf[i]);
if(i%32 == 31)
printf("\n");
}
printf("\n");
}
extern "C"
{
#include "../api_public.h"
#include "../audio_ringfifo.h"
#include "../my_audio.h"
}
int main(void)
{
int status;
int ret;
RTPSession sess;
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
/* set g711a param */
sessparams.SetUsePredefinedSSRC(true);
sessparams.SetOwnTimestampUnit(1.0/8000.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(iLocalPort);
status = sess.Create(sessparams,&transparams);
checkerror(status);
RTPIPv4Address addr(szDestAddr,iDestPort);
status = sess.AddDestination(addr);
checkerror(status);
//时间戳
sess.SetDefaultTimestampIncrement(320);
//PCMA
sess.SetDefaultPayloadType(8);
sess.SetDefaultMark(true);
//aa(0,0);这里我初始化君正的设备注释了
pG711File = fopen("./test.g711", "rb");
if(!pG711File)
{
printf("error: can not open file !\n");
return 0;
}
uint16_t iReadLen = 0;
uint8_t szBuf[1024] = {0};
uint8_t buf_g711[4096]={0};
//while( !feof(pG711File) )
while(1)
{
ret = rbCanRead(&pRb_audio_fifo1);//读fifo修改成读文件来运行
if(ret>=IMP_AUDIO_G711A/2){
rbRead(&pRb_audio_fifo1, buf_g711, IMP_AUDIO_G711A/2);
}else{
continue;
}
//iReadLen = fread(szBuf, 1, 320, pG711File);
//rtpPrintf(buf, read_len);
status = sess.SendPacket(buf_g711, IMP_AUDIO_G711A/2, 8, true, 320);
checkerror(status);
RTPTime::Wait(0.038);
}
fclose(pG711File);
return 0;
}