前言

使用 MicroSip 源码编译后,在录音配置界面虽然有 mp3 格式选项,但是实际录音后不会生成mp3 文件夹,而选择wav格式却可以正常生成 wav 文件。

经测试发现需要重新编译 pjsip 工程,加入 mp3 编码才可以。

操作步骤大概如下:

1.pjmedia 项目加入如下 pjsip2.12.1版本 third_party/mp3 文件夹中的3个文件

2.在pjmedia.h 文件中包含刚引入的 mp3_port.h

//...
#include <pjmedia/wav_port.h>
#include <pjmedia/wave.h>
#include <pjmedia/wsola.h>
//增加mp3编码 [2022-7-28 By Pafey]
#include "../../third_party/mp3/mp3_port.h"
//...

3.修改 pjsua_lib 项目的 pjsua_aud.c 文件中的 pjsua_recorder_create 函数

在录音格式判断那里,源码只有处理wav格式,需要多加个mp3格式进去。

需要注意的是第七个参数 pjmedia_mp3_encoder_option param_option;

主要是跟mp3文件的质量有关:

vbr:指定是否应使用可变比特率。可变比特率通常会产生更好的质量,但代价可能是文件更大。

bit_rate:目标比特率,单位为bps。如果启用了VBR,此设置指定请求的平均比特率,并将使编码器忽略质量设置。对于CBR,这指定了实际的比特率,如果该选项为零,它将被设置为采样率乘以通道数量。

quality:编码质量,0-9,以0为最高质量。对于VBR,质量设置只在bit_rate设置为零时生效。

关键代码如下:
    if (file_format == FMT_WAV) {status = pjmedia_wav_writer_port_create(pool, path,pjsua_var.media_cfg.clock_rate,pjsua_var.mconf_cfg.channel_count,pjsua_var.mconf_cfg.samples_per_frame,pjsua_var.mconf_cfg.bits_per_sample,options, 0, &port);}else if (file_format == FMT_MP3){//增加mp3编码 [2022-7-28 By Pafey]pjmedia_mp3_encoder_option param_option;param_option.vbr = PJ_TRUE;param_option.bit_rate = 0;param_option.quality = 6;//0-9,0质量最高,vbr启用时,仅bit_rate为0时有效status = pjmedia_mp3_writer_port_create(pool, path,pjsua_var.media_cfg.clock_rate,pjsua_var.mconf_cfg.channel_count,pjsua_var.mconf_cfg.samples_per_frame,pjsua_var.mconf_cfg.bits_per_sample,&param_option, &port);} else {PJ_UNUSED_ARG(enc_param);port = NULL;status = PJ_ENOTSUP;}
pjsua_recorder_create 函数完整代码:
/** Create a file recorder, and automatically connect this recorder to* the conference bridge.*/
PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename,unsigned enc_type,void *enc_param,pj_ssize_t max_size,unsigned options,pjsua_recorder_id *p_id)
{enum Format{FMT_UNKNOWN,FMT_WAV,FMT_MP3,};unsigned slot, file_id;char path[PJ_MAXPATH];pj_str_t ext;int file_format;pj_pool_t *pool = NULL;pjmedia_port *port;pj_status_t status = PJ_SUCCESS;/* Filename must present */PJ_ASSERT_RETURN(filename != NULL, PJ_EINVAL);/* Don't support max_size at present */PJ_ASSERT_RETURN(max_size == 0 || max_size == -1, PJ_EINVAL);/* Don't support encoding type at present */PJ_ASSERT_RETURN(enc_type == 0, PJ_EINVAL);if (filename->slen >= PJ_MAXPATH)return PJ_ENAMETOOLONG;if (filename->slen < 4)return PJ_EINVALIDOP;PJ_LOG(4,(THIS_FILE, "Creating recorder %.*s..",(int)filename->slen, filename->ptr));pj_log_push_indent();if (pjsua_var.rec_cnt >= PJ_ARRAY_SIZE(pjsua_var.recorder)) {pj_log_pop_indent();return PJ_ETOOMANY;}/* Determine the file format */ext.ptr = filename->ptr + filename->slen - 4;ext.slen = 4;if (pj_stricmp2(&ext, ".wav") == 0)file_format = FMT_WAV;else if (pj_stricmp2(&ext, ".mp3") == 0)file_format = FMT_MP3;else {PJ_LOG(1,(THIS_FILE, "pjsua_recorder_create() error: unable to ""determine file format for %.*s",(int)filename->slen, filename->ptr));pj_log_pop_indent();return PJ_ENOTSUP;}PJSUA_LOCK();for (file_id=0; file_id<PJ_ARRAY_SIZE(pjsua_var.recorder); ++file_id) {if (pjsua_var.recorder[file_id].port == NULL)break;}if (file_id == PJ_ARRAY_SIZE(pjsua_var.recorder)) {/* This is unexpected */pj_assert(0);status = PJ_EBUG;goto on_return;}pj_memcpy(path, filename->ptr, filename->slen);path[filename->slen] = '\0';pool = pjsua_pool_create(get_basename(path, (unsigned)filename->slen), 1000, 1000);if (!pool) {status = PJ_ENOMEM;goto on_return;}if (file_format == FMT_WAV) {status = pjmedia_wav_writer_port_create(pool, path,pjsua_var.media_cfg.clock_rate,pjsua_var.mconf_cfg.channel_count,pjsua_var.mconf_cfg.samples_per_frame,pjsua_var.mconf_cfg.bits_per_sample,options, 0, &port);}else if (file_format == FMT_MP3){pjmedia_mp3_encoder_option param_option;param_option.vbr = PJ_TRUE;param_option.bit_rate = 0;param_option.quality = 6;//0-9,0质量最高,vbr启用时,仅bit_rate为0时有效//增加mp3编码 [2022-7-28 By Pafey]status = pjmedia_mp3_writer_port_create(pool, path,pjsua_var.media_cfg.clock_rate,pjsua_var.mconf_cfg.channel_count,pjsua_var.mconf_cfg.samples_per_frame,pjsua_var.mconf_cfg.bits_per_sample,&param_option, &port);} else {PJ_UNUSED_ARG(enc_param);port = NULL;status = PJ_ENOTSUP;}if (status != PJ_SUCCESS) {pjsua_perror(THIS_FILE, "Unable to open file for recording", status);goto on_return;}status = pjmedia_conf_add_port(pjsua_var.mconf, pool,port, filename, &slot);if (status != PJ_SUCCESS) {pjmedia_port_destroy(port);goto on_return;}pjsua_var.recorder[file_id].port = port;pjsua_var.recorder[file_id].slot = slot;pjsua_var.recorder[file_id].pool = pool;if (p_id) *p_id = file_id;++pjsua_var.rec_cnt;PJSUA_UNLOCK();PJ_LOG(4,(THIS_FILE, "Recorder created, id=%d, slot=%d", file_id, slot));pj_log_pop_indent();return PJ_SUCCESS;on_return:PJSUA_UNLOCK();if (pool) pj_pool_release(pool);pj_log_pop_indent();return status;
}

4.编译 libpjproject 项目

生成 libpjproject-i386-Win32-vc14-Release.lib 库文件。就可以被sip软电话引入使用了。我这里用的是MicroSip,在配置界面录音选择 mp3


打个电话就可以生成mp3文件了,搞了一天终于完美收工。

问题记录

pjsip编译完成后,引入库文件依然不能生成mp3文件,后面调试进

pjmedia_mp3_writer_port_create -> init_blade_dll

这个初始化需要加载 LAME_ENC.DLL
去 microsip 安装文件夹内拷一个出来放到自己编译的microsip exe所在路径就成功了
文末放了下载地址

#include <windows.h>
#define DLL_NAME    PJ_T("LAME_ENC.DLL")/** Load BladeEncoder DLL.*/
static pj_status_t init_blade_dll(void)
{if (BladeDLL.refCount == 0) {#define GET_PROC(type, name)  \BladeDLL.name = (type)GetProcAddress(BladeDLL.hModule, PJ_T(#name)); \if (BladeDLL.name == NULL) { \PJ_LOG(1,(THIS_FILE, "Unable to find %s in %s", #name, DLL_NAME)); \return PJ_RETURN_OS_ERROR(GetLastError()); \}BE_VERSION beVersion;BladeDLL.hModule = (void*)LoadLibrary(DLL_NAME);if (BladeDLL.hModule == NULL) {pj_status_t status = PJ_RETURN_OS_ERROR(GetLastError());char errmsg[PJ_ERR_MSG_SIZE];pj_strerror(status, errmsg, sizeof(errmsg));PJ_LOG(1,(THIS_FILE, "Unable to load %s: %s", DLL_NAME, errmsg));return status;}
//...}

编译的库文件

库文件和编码dll下载地址

重编译 microsip 和 pjsip 支持 mp3 录音相关推荐

  1. cef3 源码编译 2018-12 添加支持mp3 , mp4 的编译分支3282与最新的3578版

    编译好的结果下载地址在最后 ========================================================================= 工 作中需要使用cef3 ...

  2. 在Windows下编译Cef3.2623并加入mp3、mp4支持(附带源码包和最终DLL)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/54193842 之前把离屏渲染模式的Cef3作为控件嵌入到项目窗体里.现在 ...

  3. windows下编译cef最新版本并支持mp3/mp4

    预读 不懂就请参考官方地址 一般要2步,下载 和 编译 创建文件结构 ~/code/automate/ <-- 全部脚本放到这里automate-git.py <-- CEF build ...

  4. 一款简单易用的mp3录音软件

    MP3 Audio Recorder Mac版是Mac平台上的一款录音应用.MP3 Audio Recorder Mac版是一款简单的录音软件,它可以通过系统内置或外接麦克风将音频文件录制成高品质的M ...

  5. cef ocx 支持_Cef3/Chromium的编译和音视频支持的修改

    这里以别人下载好的cef2623版本来编译(默认支持mp3/h64) 网盘地址: https://pan.baidu.com/s/1jHY4hls 编译先决条件:win64系统,安装python2.7 ...

  6. ffmpeg支持MP3编码的方法

    问题 近期一个项目中mp3文件较大,需要转成占用存储空间较小的文件.首先想到的是"格式工厂",非常便捷,但是此工具每次批量转换数量上限是1000,而我要转上万个.所以考虑用ffmp ...

  7. 使用ActiveMovie控件制作多媒体播放器(支持MP3,WAV,dat,wma,mpeg,avi等)

    使用ActiveMovie控件制作多媒体播放器(支持MP3,WAV,dat,wma,mpeg,avi等) ActiveMovieActiveMovie控件是微软公司推出的用于多媒体程序设计的控件,它提 ...

  8. 宽网mp3录音混音器 绿色

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  9. (可用)SOX 支持mp3格式转换

    Centos 通过 yum install sox 是不支持 mp3 格式语音转换,所以必须通过编译的方式安装 sox.下载附件中的两个 tar.gz 包. 如果已经通过 yum 安装了 sox  的 ...

  10. 存储过程中引用的常规表,临时表以及表变量是否会导致存储过程的重编译

    在存储过程中,经常要引用一些表来存储一些中间数据,用完即删.对于这个中间表,用常规表,临时表或者表变量有什么区别呢? 下面我们看一下这三种中间表是否会造成执行计划的重编译. 首先打开sql serve ...

最新文章

  1. FFmpeg中一个线程获取视频流一个线程执行scale测试代码
  2. 股市币市:数据分析与交易所公告(20190225)
  3. 《数学之美》第26章 维特比和他的维特比算法
  4. 两个时间计算毫秒在线_蹲坑英语时间之in a jiffy
  5. Excel VBA(宏):添加宏
  6. 在页面最上面显示当前登陆的状态
  7. java调用oracle的函数,从Java调用Oracle函数
  8. [再寄小读者之数学篇](2014-04-22 平方差公式在矩阵中的表达)
  9. 7-14 排座位 (25 分)
  10. MyBatis-DynamicSQL IF判断
  11. mysql数据字典的通俗理解_MySQL关于数据字典的一个疑问
  12. 课堂练习--最大子数组和
  13. 从技术转管理,我做了什么来拯救自己?
  14. parsley.js自定义验证规则之大小写
  15. python和basic语言的区别_Python语言是什么?学Python语言有前途吗?
  16. 2022.10月面具输入LSPosed框架以及隐藏root
  17. 山东网通/电信用户DNS设置
  18. 自定义SharePoint新网站创建过程(2)
  19. HTML如何设置四边形,css实现三角形和平形四边形
  20. 【生活小捣鼓】登录PC端某网站,需要他人(不在身边)手机扫二维码,这时候该怎么办?

热门文章

  1. kuangbin 莫队专题
  2. Java编写五线谱上的音符_五线谱入门(三)——音符详解
  3. Arm中国换帅风波始末 | 钛媒体深度
  4. 富勒wms系统里的定时器id_WMS项目实施,该如何调研?
  5. matlab可以输出图像吗,MATLAB中使用程序输出图片
  6. 微信运动计步器 php,微信修改步数(卡密版)v1.2.1 PHP程序
  7. Tomcat8安装即配置教程
  8. Matpower安装流程
  9. Unity3D灯光与渲染学习之(二):全局、烘焙以及混合光照
  10. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(十)——稳定性与频率补偿