C++ pjsip捕获和播放pcm数据

C++ pjsip捕获和播放pcm数据,c++,sip,pjsip,pcm,C++,Sip,Pjsip,Pcm,我有一些默认情况下没有音频设备的嵌入式设备。它们通过FPGA相互通信。所以我的问题是,如何在pcm中捕获/播放来自pjsip的音频,以便用FPGA发送/接收 我知道有pjmedia_mem_player_create()和pjmedia_mem_capture_create(),但我似乎找不到任何关于使用这些函数的好信息 我尝试了下面的代码,但断言失败,因为函数的一个参数为“空” 错误: pjmedia_mem_capture_create:断言“池和缓冲区大小和时钟速率和通道计数和采样数/帧和

我有一些默认情况下没有音频设备的嵌入式设备。它们通过FPGA相互通信。所以我的问题是,如何在pcm中捕获/播放来自pjsip的音频,以便用FPGA发送/接收

我知道有pjmedia_mem_player_create()和pjmedia_mem_capture_create(),但我似乎找不到任何关于使用这些函数的好信息

我尝试了下面的代码,但断言失败,因为函数的一个参数为“空”

错误:

pjmedia_mem_capture_create:断言“池和缓冲区大小和时钟速率和通道计数和采样数/帧和比特数/采样和端口”失败

注意:我主要使用pjsua2进行注册、传输等其他操作。另外,使用ep.audDevManager().setNullDev()将默认音频设置为null;如果没有这一点,拨打/接听电话就会失败

void MyCall::onCallMediaState(OnCallMediaStateParam &prm){
CallInfo ci = getInfo();

pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);
pj_pool_t *pool = pj_pool_create(&cp.factory, "POOLNAME", 2000, 2000, NULL);

void *buffer;
pjmedia_port *prt;

#define CLOCK_RATE 8000
#define CHANELS 1
#define SAMPLES_PER_FRAME 480
#define BITS_PER_SAMPLE 16

pjmedia_mem_capture_create( pool, //Pool
                            buffer, //Buffer
                            2000, //Buffer Size
                            CLOCK_RATE, 
                            CHANELS, 
                            SAMPLES_PER_FRAME, 
                            BITS_PER_SAMPLE, 
                            0, //Options
                            &prt); //The return port}
更新

断言失败,因为缓冲区变量没有分配任何内存。每帧分配两倍的样本量,以获得足够的内存

 buffer = pj_pool_zalloc(pool, 960);

另外,回调需要注册到
pjmedia_mem_capture_set_eof_cb2()
(末尾的两个是PJSIP 2.10或更高版本所必需的),显然可以从那里使用缓冲区。只是我的实现atm没有执行回调。

看起来我找到了解决方案,我修改了您的代码,并使用pjsua API用C编写了一个简单的代码,将每个帧转储到文件中。抱歉搞砸了,我不精通C:

pjsua_call_info ci;
pjsua_call_get_info(call_id, &ci);
pjsua_conf_port_info cpi;
pjsua_conf_get_port_info(ci.conf_slot, &cpi);

pj_pool_t *pool = pjsua_pool_create("POOLNAME", 2000, 2000);
pjmedia_port *prt;
uint buf_size = cpi.bits_per_sample*cpi.samples_per_frame/8;
void *buffer = pj_pool_zalloc(pool, buf_size);
pjsua_conf_port_id port_id;

pjmedia_mem_capture_create( pool,
                            buffer,
                            buf_size,
                            cpi.clock_rate,
                            cpi.channel_count,
                            cpi.samples_per_frame,
                            cpi.bits_per_sample,
                            0,
                            &prt);
pjmedia_mem_capture_set_eof_cb(prt, buffer, dump_incoming_frames);
pjsua_conf_add_port(pool, prt, &port_id);
pjsua_conf_connect(ci.conf_slot, port_id); //connect port with conference

///////dumping frames///
static pj_status_t dump_incoming_frames(pjmedia_port * port, void * usr_data){
   pj_size_t buf_size = pjmedia_mem_capture_get_size(port);
   char * data = usr_data;
   ...
   fwrite(data,sizeof(data[0]),buf_size,fptr);
   ...
}
文档说,
pjmedia\u mem\u capture\u set\u eof\u cb
已被弃用,但我无法工作
pjmedia\u mem\u capture\u set\u eof\u cb2
buf\u size
对于
dump\u传入帧的每次调用都是0,所以只剩下弃用的函数。我也取得了同样的成功

我希望您可以轻松地将其修改为C++/pjsua2代码

UPD:
我修改了PJSIP,并将音频输入输出流打包到适当的PJSUA2/Media类中,以便可以从Python调用它。完整代码为。

您在这方面有什么进展吗?我也遇到了同样的问题,至今还没有。我曾试图联系开发人员,但遗憾的是没有回应。老兄,你真是个天才!在为使公共广播设置正确的值进行了长时间的斗争之后,它开始工作了。