pjsip захватывает и воспроизводит данные pcm - PullRequest
1 голос
/ 11 февраля 2020

У меня есть некоторые встроенные устройства, которые не имеют аудиоустройства по умолчанию. Они общаются друг с другом через ПЛИС. Итак, мой вопрос, как мне захватить / воспроизвести аудио из pjsip в pcm, чтобы отправить / получить его с FPGA? Я знаю, что есть pjmedia_mem_player_create () и pjmedia_mem_capture_create () , но мне не удается найти какую-либо полезную информацию об использовании этих функций.

Я пробовал следующее фрагмент кода, но утверждение не выполнено, так как один из параметров функции является «пустым».

Ошибка: pjmedia_mem_capture_create: утверждение `pool && buffer && size && clock_rate && channel_count && samples_per_frame && bits_per_sample && p_port ' не удалось.

Примечание. В основном я использую pjsua2 для всего остального, например для регистрации, транспорта и т. д. c. Кроме того, для звука по умолчанию установлено значение null с помощью ep.audDevManager (). SetNullDev (); , поскольку без этого выполнение / получение вызова просто не удастся?!

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}

UPDATE : Утверждение не выполнено, потому что для переменной буфера не выделена память. Выделите вдвое большее количество выборок на кадр, чтобы иметь достаточную память.

buffer = pj_pool_zalloc(pool, 960);

Также необходимо зарегистрировать обратный вызов с pjmedia_mem_capture_set_eof_cb2() (два в конце необходимы для PJSIP 2.10 или позже) По всей видимости, оттуда можно использовать буфер. Просто моя реализация atm не выполняет обратный вызов.

...