PJSIP-PJMEDIA【使用pjmedia 播放wav格式的音乐】
应宝哥建议以及更好的交流学习,这篇开始使用中文,英语就先放一放吧!
要使用PJSIP中的PJMEDIA首先我们需要搭建好它所需要的环境。
【环境搭建与调试】
1 在 工具 加入pjmedia所需要的包含文件以及库文件
2 在 项目属性 中的加入包含文件以及库文件和具体使用到的库名
3 编译过程中出现无法解析外部符号时,自习观察报错的提示,(如关键字可能为srtp,可以去工程文件下的third_party中去添加相关库或者包含文件)。
【实例功能】
播放一个wav格式的文件。
实例出处:http://www.pjsip.org/docs/latest/pjmedia/docs/html/page_pjmedia_samples_playfile_c.htm
1 //PJMEDIA play a wav file 2 //heat nan 3 //改编自官网实例 4 #include<pjlib.h> 5 #include<pjlib-util.h> 6 #include<stdlib.h> 7 #include<pjmedia.h> 8 #include<stdio.h> 9 int main() 10 { 11 pj_status_t status; 12 char filename[50]="windows.wav";// the file's name which you are want to play 13 pj_caching_pool cp; 14 pjmedia_endpt *med_endpt; 15 pj_pool_t *pool; 16 pjmedia_port *file_port; 17 pjmedia_snd_port *snd_port; 18 int i; 19 //if you want to use the pjlib lib, you must init it first 20 status=pj_init(); 21 if(status==PJ_SUCCESS) 22 { 23 printf("pj_init success!\n"); 24 } 25 //在我们分配内存前需要首先建立一个pool factory 26 pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0); 27 28 //创建一个媒体实例的endpoint 29 status = pjmedia_endpt_create(&cp.factory, NULL, 1, &med_endpt); 30 if(status!=PJ_SUCCESS) 31 { 32 PJ_LOG(3,("pjmedia create","failed")); 33 } 34 //为我们的文件播放器创建内存池 35 pool=pj_pool_create(&cp.factory,"wav",4000,4000,NULL); 36 //创建一个媒体端口从wav文件中播放 37 status=pjmedia_wav_player_port_create(pool,&filename,20,0,0,&file_port); 38 if(status!=PJ_SUCCESS) 39 { 40 PJ_LOG(3,("pjmedia port","Unable to use WAV file")); 41 } 42 //创建一个单向的音频设备端口来播放制定参数相关的音频流 43 status=pjmedia_snd_port_create_player(pool,-1,PJMEDIA_PIA_SRATE(&file_port->info),PJMEDIA_PIA_CCNT(&file_port->info), PJMEDIA_PIA_SPF(&file_port->info), PJMEDIA_PIA_BITS(&file_port->info),0, &snd_port); 44 if(status!=PJ_SUCCESS) 45 { 46 PJ_LOG(3,("pjmedia","create player failed")); 47 } 48 //连接文件端口和音频设备端口 49 status=pjmedia_snd_port_connect(snd_port,file_port); 50 if(status!=PJ_SUCCESS) 51 { 52 PJ_LOG(3,("connect","failed")); 53 } 54 55 //如果成功,音乐已经开始响起 56 /* 57 for(i=0;i<100;++i) 58 { 59 pj_int16_t framebuf[640]; 60 pjmedia_frame frm; 61 pj_int32_t level32; 62 unsigned ms; 63 int level; 64 65 frm.buf=framebuf; 66 frm.size=sizeof(framebuf); 67 68 pjmedia_port_get_frame(file_port,&frm); 69 70 level32=pjmedia_calc_avg_signal(framebuf,PJMEDIA_PIA_SPF(&file_port->info)); 71 level=pjmedia_linear2ulaw(level32)^0xFF; 72 ms=i*1000*PJMEDIA_PIA_SPF(&file_port->info)/PJMEDIA_PIA_SRATE(&file_port->info); 73 printf("%03d.%03d\t%07d\t%7d\n",ms/1000,ms%1000,level,level32); 74 } 75 76 */ 77 //提示 78 printf("Press<ENTER>to stop the music!\n"); 79 80 getchar(); 81 82 return 0; 83 84 85 }