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!
");
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	%07d	%7d
",ms/1000,ms%1000,level,level32);
74     }
75 
76 */
77     //提示
78      printf("Press<ENTER>to stop the music!
");
79     
80 getchar();
81 
82     return 0;
83 
84 
85 }
原文地址:https://www.cnblogs.com/heat-man/p/3647416.html