MP3标准

MP3,即MPEG Layer III。MPEG有几个版本的协议,不同版本的协议能够支持的参数能力是不同的。编码库的使用者必须清楚不同版本的区别才能正确的设置参数。

有以下3个版本的协议,MPEG1、MPEG2、MPEG2.5。其中MPEG2.5是非官方的标准,但是流传广泛,所以基本也都支持。他们的区别主要集中在支持的比特率和采样率不同。

MP3参数

但是mp3有很多参数,这里列举几个mp3编码的必要参数。

  • 采样率(sampleRate):采样率越高声音的还原度越好。
  • 比特率(bitrate):每秒钟的数据量,越高音质越好。
  • 声道数(channels):声道的数量,通常只有单声道和双声道,双声道即所谓的立体声。
  • 比特率控制模式:ABR、VBR、CBR

LAME介绍

lame是一个有名的开源mp3编码库。具体可参考:https://lame.sourceforge.io/

编码流程

使用lame库只需要包含lame.h头文件,编码mp3基本上遵循以下的流程。

  • 初始化编码参数

lame_init:初始化一个编码参数的数据结构,给使用者用来设置参数。

  • 设置编码参数

lame_set_in_samplerate():设置被输入编码器的原始数据的采样率。
lame_set_out_samplerate():设置最终mp3编码输出的声音的采样率,如果不设置则和输入采样率一样。
lame_set_num_channels() :设置被输入编码器的原始数据的声道数。
lame_set_mode() :设置最终mp3编码输出的声道模式,如果不设置则和输入声道数一样。参数是枚举,STEREO代表双声道,MONO代表单声道。
lame_set_VBR():设置比特率控制模式,默认是CBR,但是通常我们都会设置VBR。参数是枚举,vbr_off代表CBR,vbr_abr代表ABR(因为ABR不常见,所以本文不对ABR做讲解)vbr_mtrh代表VBR。
lame_set_brate():设置CBR的比特率,只有在CBR模式下才生效。
lame_set_VBR_mean_bitrate_kbps():设置VBR的比特率,只有在VBR模式下才生效。
其中每个参数都有默认的配置,如非必要可以不设置。

  • 初始化编码器

lame_init_params():根据上面设置好的参数建立编码器

  • 编码PCM数据

lame_encode_buffer()或lame_encode_buffer_interleaved():将PCM数据送入编码器,获取编码出的mp3数据。这些数据写入文件就是mp3文件。
        其中lame_encode_buffer输入的参数中是双声道的数据分别输入的,lame_encode_buffer_interleaved输入的参数中双声道数据是交错在一起输入的。具体使用哪个需要看采集到的数据是哪种格式的,不过现在的设备采集到的数据大部分都是双声道数据是交错在一起。单声道输入只能使用lame_encode_buffer,把单声道数据当成左声道数据传入,右声道传NULL即可。调用这两个函数时需要传入一块内存来获取编码器出的数据,这块内存的大小lame给出了一种建议的计算方式:采样率/20+7200。

  • 结束编码

lame_encode_flush:结束编码,获取编码出的结束数据。这部分数据也需要写入mp3文件。

  • 5.6 销毁编码器

lame_close()销毁编码器,释放资源。

libmp3lame的接口使用相关推荐

  1. 转 Java知识——精华总结

    一.java概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.  为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路. ...

  2. 编程资料 -C# 多线程

    编程资料 - 多线程 C#多线程编程实例实战 作者: 刘弹 www.ASPCool.com 时间:2003-5-17 上午 10:24:05 阅读次数:10996 单个写入程序/多个阅读程序在.Net ...

  3. 编程资料 -C# 多线程 1

    编程资料 - 多线程 C#多线程编程实例实战 作者: 刘弹 www.ASPCool.com 时间:2003-5-17 上午 10:24:05 阅读次数:10996 单个写入程序/多个阅读程序在.Net ...

  4. Build ffmpeg for Android with libmp3lame and libshine

    1. What's FFmpeg 最初知道ffmpeg是在大四的时候做tongli那个项目,需要重新写一个播放器,然后了解到需要用ffmpeg来解码视频.根据官网的介绍,它是一个多媒体框架,可以解码. ...

  5. 使用第三方SDK(如微信、qq、快看、头条等),调用接口405 Method Not Allowed

    使用第三方SDK(如微信.qq.快看.头条等),调用接口405 Method Not Allowed 错误描述:postman请求正常,但客户端调用后接口没有反应,但返回了405错误. 解决方法:第三 ...

  6. OpenFeign服务接口调用

    OpenFeign是什么? Feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可. OpenFeign能干什么? Feign和OpenF ...

  7. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)

    1. 接口的定义 接口是和调用方的一种约定,它是一个高度抽象的类型,不用和具体的实现细节绑定在一起.接口要做的是定义好约定,告诉调用方自己可以做什么,但不用知道它的内部实现,这和我们见到的具体的类型如 ...

  8. Go 学习笔记(64)— Go error.New 创建接口错误对象、fmt.Errorf 创建接口错误对象、errors.Is 和 errors.As

    1. error 接口定义 除用 panic 引发中断性错误外,还可返回 error 类型错误对象来表示函数调用状态.error 接口是 Go 原生内置的类型,它的定义如下: // $GOROOT/s ...

  9. REST接口设计规范

    REST接口设计规范 (超级详细) RESTful API 设计指南 (阮一峰)

  10. 微机原理—定时计数控制接口

    别看题目很高深,其实就是很简单的定时器和计数器而已. 通常用手机定个闹钟,就是定时器的使用. 工厂里通过传送带上安装传感器,传感器传输给计算机的信号用来计数. 这是一些很简单的应用,通过很小的一个芯片 ...

最新文章

  1. firewall添加白名单_firewall的规则设置与命令(白名单设置)
  2. Java操作HDFS文件系统
  3. 问题:linux系统经常出现断网的情况,重启之后系统恢复正常
  4. mybatis_user_guide(3)XML配置
  5. 一个memset函数使用时的坑
  6. javascript经典问题总结及代码实例(未完待续)
  7. select2 清除已选项
  8. 教程-脚本之Python
  9. Oracle的共享关闭 独有关闭和共享更新关闭 (2)
  10. 计算机图形学与混合现实研讨会GAMES: Graphics And Mixed Environment Seminar
  11. html 下划线_web前端实战入门训练之HTML基本元素
  12. 区块链:深入浅出零知识证明
  13. 三菱gxworks3安装失败_三菱GX软件安装出错处理大全
  14. 随笔 - 记录下当前的生活
  15. 数据化是什么,企业为什么要数据化管理?【Teamface企典】
  16. close()是不是python内置函数_python 内置函数
  17. 中小团队落地配置中心详解
  18. 网页版双色球号码生成工具
  19. 【技术分享】python web 安全总结
  20. 可以储存照片的字段类型是_如果将学生的“照片”存储在表中,则数据应采用的字段类型为...

热门文章

  1. 将源码打包成deb软件包
  2. centos7 定时清理内存
  3. 新·自学日语教材推荐加点评
  4. 以替换为主的疯狂填词、sub()介绍
  5. rabbitmq port is already allocated
  6. AT32F435_437_USB_MSC_SDIO
  7. 学java用不用学ps_【No935】零基础学习从入门到精通Ps课程
  8. android小米手机变慢,小米安卓系统手机上网速度慢的解决方法
  9. 最近智商拙计,做做题补一下
  10. 基于TILE-GX实现快速数据包处理框架-netlib实现分析