vlc播放rtp g711音频,交叉编译jrtplib、jthread

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;

}




 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌风_lwp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值