http://blog.csdn.net/lucytheslayer/article/details/74279784
代码来源于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;
- }
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);
- }
- }