为了熟悉pjmedia的相关函数以及使用方法,这里练习了官网上的一个录音器的例子。

核心函数:

pj_status_t pjmedia_wav_writer_port_create ( pj_pool_t pool,
    const char *  filename,
    unsigned  clock_rate,
    unsigned  channel_count,
    unsigned  samples_per_frame,
    unsigned  bits_per_sample,
    unsigned  flags,
    pj_ssize_t  buff_size,
    pjmedia_port **  p_port 
  )    

Create a media port to record streams to a WAV file. Note that the port must be closed properly (with pjmedia_port_destroy()) so that the WAV header can be filled with correct values (such as the file length). WAV writer port supports for writing audio in uncompressed 16 bit PCM format or compressed G.711 U-law/A-law format, this needs to be specified in flags param.

Parameters
pool Pool to create memory buffers for this port.
filename File name.
clock_rate The sampling rate.
channel_count Number of channels.
samples_per_frame Number of samples per frame.
bits_per_sample Number of bits per sample (eg 16).
flags Port creation flags, see pjmedia_file_writer_option.
buff_size Buffer size to be allocated. If the value is zero or negative, the port will use default buffer size (which is about 4KB).
p_port Pointer to receive the file port instance.
Returns
PJ_SUCCESS on success.
pj_status_t pjmedia_snd_port_create_rec ( pj_pool_t pool,
    int  index,
    unsigned  clock_rate,
    unsigned  channel_count,
    unsigned  samples_per_frame,
    unsigned  bits_per_sample,
    unsigned  options,
    pjmedia_snd_port **  p_port 
  )    

Create unidirectional sound device port for capturing audio streams from the sound device with the specified parameters.

Parameters
pool Pool to allocate sound port structure.
index Device index, or -1 to let the library choose the first available device.
clock_rate Sound device's clock rate to set.
channel_count Set number of channels, 1 for mono, or 2 for stereo. The channel count determines the format of the frame.
samples_per_frame Number of samples per frame.
bits_per_sample Set the number of bits per sample. The normal value for this parameter is 16 bits per sample.
options Options flag.
p_port Pointer to receive the sound device port instance.
Returns
PJ_SUCCESS on success, or the appropriate error code.
pj_status_t pjmedia_endpt_create ( pj_pool_factory pf,
    pj_ioqueue_t ioqueue,
    unsigned  worker_cnt,
    pjmedia_endpt **  p_endpt 
  )    

Create an instance of media endpoint.

Parameters
pf Pool factory, which will be used by the media endpoint throughout its lifetime.
ioqueue Optional ioqueue instance to be registered to the endpoint. The ioqueue instance is used to poll all RTP and RTCP sockets. If this argument is NULL, the endpoint will create an internal ioqueue instance.
worker_cnt Specify the number of worker threads to be created to poll the ioqueue.
p_endpt Pointer to receive the endpoint instance.
Returns
PJ_SUCCESS on success.
pj_status_t pjmedia_snd_port_connect ( pjmedia_snd_port snd_port,
    pjmedia_port port 
  )    

Connect a port to the sound device port. If the sound device port has a sound recorder device, then this will start periodic function call to the port's put_frame() function. If the sound device has a sound player device, then this will start periodic function call to the port's get_frame() function.

For this version of PJMEDIA, the media port MUST have the same audio settings as the sound device port, or otherwise the connection will fail. This means the port MUST have the same clock_rate, channel count, samples per frame, and bits per sample as the sound device port.

Parameters
snd_port The sound device port.
port The media port to be connected.
Returns
PJ_SUCCESS on success, or the appropriate error code.
//capture sound to wav file
//heat nan -test
#include<pjmedia.h>
#include<pjlib.h>
#include<stdio.h>
#include<stdlib.h> #define CLOCK_RATE 44100 //采样率
#define NCHANNELS 2 //通道数
#define SAMPLES_PER_FRAME (NCHANNELS *(CLOCK_RATE*10/1000)) //每帧包含的采样数
#define BITS_PER_SAMPLE 16 //每个抽样的字节数 int main()
{
pj_caching_pool cp;
pjmedia_endpt *med_endpt;
pj_pool_t *pool;
pjmedia_port *file_port;
pjmedia_snd_port *snd_port;
pj_status_t status;
char tmp[10];
char filename[20]; status=pj_init();
if(status!=PJ_SUCCESS)
{
PJ_LOG(3,("failed","pj_init"));
} pj_caching_pool_init(&cp,&pj_pool_factory_default_policy,0);
//创建endpoint
status=pjmedia_endpt_create(&cp.factory,NULL,1,&med_endpt);
if(status!=PJ_SUCCESS)
{
PJ_LOG(3,("failed","pjmedia_endpt_create"));
} pool=pj_pool_create(&cp.factory,
"wav_recoder",4000,4000,NULL);
//输入要保存录音的文件名
PJ_LOG(3,("wav_recorder","please input the file name!"));
gets(filename);
//创建录音端口 把音频流写成wav文件
status=pjmedia_wav_writer_port_create(pool,filename,
CLOCK_RATE,
NCHANNELS,
SAMPLES_PER_FRAME,
BITS_PER_SAMPLE,
0,0,
&file_port //指向接收该实例的pjmedia_port
);
if(status!=PJ_SUCCESS)
{
PJ_LOG(3,("failed","pjmedia_wav_write_port_create"));
}
//创建单向的音频设备端口用来捕获音频
status=pjmedia_snd_port_create_rec(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);
if(status!=PJ_SUCCESS)
{
PJ_LOG(3,("failed","pjmedia_snd_port_create_rec"));
}
//连接两个端口开始录音
status=pjmedia_snd_port_connect(snd_port,file_port);
if(status!=PJ_SUCCESS)
{
PJ_LOG(3,("failed","pjmedia_snd_port_connect"));
} pj_thread_sleep(10);
//显示终止信息
puts("PRESS <ENTER> to stop recording and quit"); if(fgets(tmp,sizeof(tmp),stdin)==NULL)
{
puts("EOF while reading stdin,will quit now..");
}
//养成良好习惯,吃完饭总要刷刷碗吧!
pjmedia_snd_port_destroy(snd_port);
pjmedia_port_destroy(file_port); pj_pool_release(pool);
pjmedia_endpt_destroy(med_endpt); pj_caching_pool_destroy(&cp); pj_shutdown();
return 0;
// pj_thread_sleep(10); }

PJMEDIA之录音器的使用(capture sound to avi file)的更多相关文章

  1. Android 录音器

    Android自带的mediarecoder录音器不含pause暂停功能,解决方法:录制多个音频片段,最后合成一个文件. 参照 : http://blog.csdn.net/a601445984/ar ...

  2. 用swift实现自动录音器

    基本介绍 自动录音与一般录音区别在:不用像微信那样按下录音-松手结束,而是根据说话声音的大小自动判断该录音和该停止的点,然后可以做到结束录音之后马上播放出来.类似于达到会说话的汤姆猫那样的效果. 在自 ...

  3. 录音器 AudioRecorder

    实现录音器有两种方式可以选择: 1.AudioRecord(基于字节流录音) 优点:可以实现语音的实时处理,进行边录边播,对音频的实时处理. 缺点:输出的是PCM的语音数据,如果保存成音频文件是不能被 ...

  4. H5调用手机的相机/摄像/录音等功能 _input:file的capture属性说明

    H5使用input标签调用系统默许相机,摄像,录音功能.使用input:file标签, 去调用系统默认相机,摄像,录音功能,其实是有个capture属性,直接说明需要调用什么功能: <input ...

  5. 经典alsa 录音和播放程序

    这里贴上虚拟机ubuntu下alsa的录音程序(capture.c)和播放程序(playback.c)的源码. 首先要测试一下自己的ubuntu是否打开了声音.这个可以打开/系统/首选项/声音  来调 ...

  6. android 音乐播放器

    本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...

  7. DirectX.Capture Class Library

    DirectX.Capture Class Library Brian Low,              29 Mar 2008                                    ...

  8. Android MP3录音实现

    给APP做语音功能,必须考虑到IOS和Android平台的通用性.wav录音质量高,文件太大,AAC和AMR格式在IOS平台却不支持,所以采用libmp3lame把AudioRecord音频流直接转换 ...

  9. IOS 实现 AAC格式 录音 录音后自动播放

    废话不说了 不知道aac可以百度一下 下面直接上代码,一个h文件 一个m文件 搞定! #import <AVFoundation/AVFoundation.h> #import <U ...

随机推荐

  1. 关于ubuntu安装软件的问题:apt-get和dpkg区别?

    两者的区别是dpkg绕过apt包管理数据库对软件包进行操作,所以你用dpkg安装过的软件包用apt可以再安装一遍,系统不知道之前安装过了,将会覆盖之前dpkg的安装.1.dpkg是用来安装.deb文件 ...

  2. mysql在控制台里出现中文问号问题

    由于重装了wampserver,之前遇到的问题统统会重新出现,那么今天遇到的是在mysql控制台中,在表里输入中文数据,却出现问号的问题: 那么这个就跟编码有关系了,那么,我们就去wampserver ...

  3. rosservice call ERROR:Unable to load type ... Have you typed 'make'

    you need to source in the new terminal $ source ~/catkin_ws/devel/setup.bash

  4. C++学习之虚析构函数

    什么样的情况下才需要虚析构函数? 类需要控制自己的对象执行一系列操作时发生什么样的行为,这些操作包括:创建(对象).拷贝.移动.赋值和销毁.在继承体系中,如果一个类(基类或其派生的类)没有定义拷贝控制 ...

  5. 基数排序C#界面版

    第一步:生成数据  第二步:读取数据 第三步:创建队列 第四步:入队分配 第五步:出队收集重复第四步与第五步,直到出队入队各四次,完成基数排序:如下:4次入队结束后如下:最后一次出队:基数排序完成.. ...

  6. 20145238 —《Java程序设计》—第5周学习总结

    20145238 <Java程序设计>第5周学习总结 教材学习内容总结 第八章异常处理 8.1.1使用try.catch ·教材范例用户连续输入整数,输入0结束后显示输入数的平均值(代码如 ...

  7. Python-三元运算符和lambda表达式

    一.三元运算符 #当满足条件1时,res=值1:否则res=值2 res = 值1 if 条件1 else 值2 举例说明: res=10 #简单的if else语句 if abs(res)>0 ...

  8. Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points

    Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple ...

  9. CUDA中多维数组以及多维纹理内存的使用

    纹理存储器(texture memory)是一种只读存储器,由GPU用于纹理渲染的图形专用单元发展而来,因此也提供了一些特殊功能.纹理存储器中的数据位于显存,但可以通过纹理缓存加速读取.在纹理存储器中 ...

  10. HTML页面生成ASPX页面

    这个功能是在DTcms Demo网站里面扣出来的一个小功能,他的Demo网站里面可以在HTML写好所有的代码,然后生成一下ASPX页面,就可以访问了.具体的流程下篇文章来分析.这篇文章主要是讲HTML ...