PJMEDIA之录音器的使用(capture sound to avi file)
为了熟悉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)的更多相关文章
- Android 录音器
Android自带的mediarecoder录音器不含pause暂停功能,解决方法:录制多个音频片段,最后合成一个文件. 参照 : http://blog.csdn.net/a601445984/ar ...
- 用swift实现自动录音器
基本介绍 自动录音与一般录音区别在:不用像微信那样按下录音-松手结束,而是根据说话声音的大小自动判断该录音和该停止的点,然后可以做到结束录音之后马上播放出来.类似于达到会说话的汤姆猫那样的效果. 在自 ...
- 录音器 AudioRecorder
实现录音器有两种方式可以选择: 1.AudioRecord(基于字节流录音) 优点:可以实现语音的实时处理,进行边录边播,对音频的实时处理. 缺点:输出的是PCM的语音数据,如果保存成音频文件是不能被 ...
- H5调用手机的相机/摄像/录音等功能 _input:file的capture属性说明
H5使用input标签调用系统默许相机,摄像,录音功能.使用input:file标签, 去调用系统默认相机,摄像,录音功能,其实是有个capture属性,直接说明需要调用什么功能: <input ...
- 经典alsa 录音和播放程序
这里贴上虚拟机ubuntu下alsa的录音程序(capture.c)和播放程序(playback.c)的源码. 首先要测试一下自己的ubuntu是否打开了声音.这个可以打开/系统/首选项/声音 来调 ...
- android 音乐播放器
本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...
- DirectX.Capture Class Library
DirectX.Capture Class Library Brian Low, 29 Mar 2008 ...
- Android MP3录音实现
给APP做语音功能,必须考虑到IOS和Android平台的通用性.wav录音质量高,文件太大,AAC和AMR格式在IOS平台却不支持,所以采用libmp3lame把AudioRecord音频流直接转换 ...
- IOS 实现 AAC格式 录音 录音后自动播放
废话不说了 不知道aac可以百度一下 下面直接上代码,一个h文件 一个m文件 搞定! #import <AVFoundation/AVFoundation.h> #import <U ...
随机推荐
- java——二叉树面试题
import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...
- java集合框架——List
一.List接口概述 List有个很大的特点就是可以操作角标. 下面开始介绍List接口中相对于Collection接口比较特别的方法.在Collection接口中已经介绍的方法此处就不再赘述. 1. ...
- ELF文件中section与segment的区别
http://blog.csdn.net/joker0910/article/details/7655606 1. ELF中的section主要提供给Linker使用, 而segment提供给Load ...
- 2019.03.15 ZJOI2019模拟赛 解题报告
得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...
- 0001-BUGIFX-Magento-Zend-Framework-1-PHP5.6.patch
It is from the full Github-Gist: Bugfix for Zend Framework 1 in Magento (>= 1.7..) + PHP 5.6 http ...
- 2018.8.15 AOP面向切面编程简单理解
在Filter过滤器中 拦截器 表面上看 -拦截器帮我们封装了很多功能 拦截器优秀的设计,可拔插设计 aop思想 在struts2中 归纳总结
- MAC卸载/删除 Parallels Desktop虚拟机的方法
一些MAC用户在自己的电脑上安装了虚拟机之后,想要将它卸载,但是不知道该怎么做.今天小编就为大家带来了这个问题的解决方法. 解决方案(删除/卸载虚拟机 (VM): 1.启动Parallels Desk ...
- 解决cdh4.5.0下 MAP任务看不到状态
参考 http://qnalist.com/questions/772595/yarn-jobhistory-service 在mapreduce-site.xml中添加 <property&g ...
- 14、SpringBoot------定制错误返回内容json格式
开发工具:STS 前言: 在前后端分离的项目中,当前端向后端请求资源失败时,想知道具体的错误原因,给用户予以提示. 但是,在springboot中返回内容是固定的.并不适合我们前端进行分析. 所以,就 ...
- Mybatis学习的一些细节
一.mybatis 基本配置 最近几天一直在学习mybatis,看了一些源码,本文讲述mybatis的一些基本配置和基本的用法和注意到一些细节.个人时间和精力有限,本文属于流水账类型,不成体系,算是自 ...