您的位置:首页 > 其它

linphone mediatreamer simple demo 之 录音

2017-07-04 09:01 405 查看
代码来源于https://github.com/Xianleewu/mediastreamer2-demo

做了一些小修改,以适应新版版本 linphone-sdk-3.11.1

在win32环境下运行通过

本文章仅个人记录用

#include <stdio.h>
#include <mediastreamer2/mediastream.h>
#include <mediastreamer2/mscommon.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msfilerec.h>

int main(void)
{
MSFactory* _factory = NULL;
_factory = ms_factory_new_with_voip();

MSFilter *msReader = NULL;
MSFilter *msRecorder = NULL;
MSFilter *msPlayer = NULL;
MSFilter *msTee = NULL;

MSTicker  *mTicker = NULL;
MSSndCard *recoCard = NULL;
MSSndCard *playCard = NULL;
int sampRate = 44110;
int nChannels = 2;

ortp_init();
ortp_set_log_level_mask("FAN",ORTP_MESSAGE | ORTP_WARNING | ORTP_ERROR | ORTP_FATAL);
ms_init();

recoCard = ms_snd_card_manager_get_default_capture_card(ms_snd_card_manager_get());//获取麦克风
playCard = ms_snd_card_manager_get_default_playback_card(ms_snd_card_manager_get());//获取喇叭

if (!recoCard || !playCard)
{
ortp_error("can not get an sound card !");
goto end;
}

/*
初始化四个filter
*/
msReader = ms_snd_card_create_reader(recoCard);
msPlayer = ms_snd_card_create_writer(playCard);
msRecorder = ms_filter_new(MS_FILE_REC_ID);
msTee = ms_filter_new(MS_TEE_ID);

ms_filter_call_method(msReader, MS_FILTER_SET_SAMPLE_RATE, &sampRate);
ms_filter_call_method(msReader, MS_FILTER_SET_NCHANNELS, &nChannels);

ms_filter_call_method(msPlayer, MS_FILTER_SET_SAMPLE_RATE, &sampRate);
ms_filter_call_method(msPlayer, MS_FILTER_SET_NCHANNELS, &nChannels);

ms_filter_call_method(msRecorder, MS_FILTER_SET_SAMPLE_RATE, &sampRate);
ms_filter_call_method(msRecorder, MS_FILTER_SET_NCHANNELS, &nChannels);
ms_filter_call_method(msRecorder, MS_FILE_REC_OPEN, "recorder.wav");
ms_filter_call_method_noarg(msRecorder, MS_FILE_REC_START);

/*
开启ticker线程,它将从msReader中读取音频流
*/
mTicker = ms_ticker_new();

/*
-> 直接播放
麦克风输入-> mstee
-> 录制到recorder.wav
*/
ms_filter_link(msReader, 0, msTee, 0);
ms_filter_link(msTee, 0, msRecorder, 0);
ms_filter_link(msTee, 1, msPlayer, 0);
ms_ticker_attach(mTicker, msReader);

//等待msticker 5s,5s后退出程序
ms_sleep(5);

ms_ticker_detach(mTicker, msReader);
ms_filter_unlink(msReader, 0, msTee, 0);
ms_filter_unlink(msTee, 0, msRecorder, 0);
ms_filter_unlink(msTee, 1, msPlayer, 0);

ms_filter_call_method_noarg(msRecorder, MS_FILE_REC_CLOSE);

ms_filter_destroy(msReader);
ms_filter_destroy(msRecorder);
ms_filter_destroy(msPlayer);
ms_filter_destroy(msTee);

ortp_message("done");

end:
ms_factory_destroy(_factory);
return 0;
}


那么这个msTee是干什么用的呢,找到其源文件,发现有这么句描述
A filter that reads from input and copy to its multiple outputs

配合具体源码:

static void tee_process(MSFilter *f){
TeeData *d=(TeeData*)f->data;
mblk_t *im;
int i;
while((im=ms_queue_get(f->inputs[0]))!=NULL){
for(i=0;i<f->desc->noutputs;i++){
if (f->outputs[i]!=NULL && !d->muted[i])
ms_queue_put(f->outputs[i],dupmsg(im));
}
freemsg(im);
}
}
作用就是将一个输入流复制成多个输出流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linphone mediastream