【开源项目】minimp3 MP3解码器

2024-06-22 03:58

本文主要是介绍【开源项目】minimp3 MP3解码器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【开源项目】minimp3 MP3解码器

简介

minimp3 是一个极简的MP3解码器,它的特点是小巧(只有单个头文件)、快速(支持SSE和NEON)和准确(符合ISO标准)。

LICENSE:CC0-1.0 License

项目地址:

https://github.com/lieff/minimp3

该项目中提供了在 i7-6700K 上使用 perf粗略测量的基准测试结果:

VectorHzSamplesSecClockticksClockticks per secondPSNRMax diff
compl.bit480002488325.184143066842.759M124.221
he_32khz.bit320001728005.484261581.560M139.671
he_44khz.bit4410047232010.710212963001.988M144.041
he_48khz.bit480001728003.684538462.348M139.671
hecommon.bit44100691201.56731697152.022M133.931
he_free.bit441001566723.55257984181.632M137.481
he_mode.bit441002626565.95598823141.659M118.001
si.bit441001359363.08271705202.326M120.301
si_block.bit44100737281.67142331362.533M125.181
si_huff.bit44100864001.95947853222.442M107.981
sin1k0db.bit4410072576016.457248429771.509M111.031

使用

minimp3 的使用十分简单,基础解码功能使用的话只需要两个步骤,并且只需要调用以下两个函数就可以完成解码。

void mp3dec_init(mp3dec_t *dec);
int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info);

首先,初始化 minimp3 的解码器结构:

//#define MINIMP3_ONLY_MP3
//#define MINIMP3_ONLY_SIMD
//#define MINIMP3_NO_SIMD
//#define MINIMP3_NONSTANDARD_BUT_LOGICAL
//#define MINIMP3_FLOAT_OUTPUT
#define MINIMP3_IMPLEMENTATION
#include "minimp3.h"
...static mp3dec_t mp3d;mp3dec_init(&mp3d);

注意你必须在一个源文件中定义 MINIMP3_IMPLEMENTATION

然后,我们逐帧解码输入的数据流:

    /*typedef struct{int frame_bytes;int channels;int hz;int layer;int bitrate_kbps;} mp3dec_frame_info_t;*/mp3dec_frame_info_t info;short pcm[MINIMP3_MAX_SAMPLES_PER_FRAME];/*unsigned char *input_buf; - input byte stream*/samples = mp3dec_decode_frame(&mp3d, input_buf, buf_size, pcm, &info);

mp3dec_decode_frame() 函数会从输入缓冲区解码一个完整的MP3帧,所以输出缓冲区必须足够大,可以容纳一个完整的帧。

解码器将分析输入缓冲区以正确地与MP3流同步,输入缓冲区的大小越大,同步过程就越可靠。建议每次在输入缓冲区中有多达 10 个连续的 MP3 帧(~16KB)。

消耗的 MP3 数据的大小在定义的mp3dec_frame_info_t结构中的frame_bytes字段中返回,你必须在下一次解码器调用之前从输入缓冲区中删除对应于 frame_bytes 字段的数据。

解码函数返回已解码样本的数量samples。可能出现以下情况:

  • 0: 在输入缓冲区中未找到 MP3 数据
  • 384: Layer 1
  • 576: MPEG 2 Layer 3
  • 1152: Otherwise

samples 和 frame_bytes 字段值:

  • samples > 0frame_bytes > 0: 成功解码
  • samples == 0frame_bytes > 0: 解码器跳过了 ID3 或无效数据
  • samples == 0frame_bytes == 0: 数据不足

minimp3还有提供许多的配置与接口,可以实现更多的功能,详细的请查看该项目的README.md。

测试程序

写一个简单的测试程序进行解码并播放MP3:

unsigned char *input_buf = NULL;
int data_size = 0;
//打开MP3文件
FILE* file=fopen("test.mp3", "r");//获取MP3文件长度
fseek(file, 0, SEEK_END);
data_size = (int)ftell(file);//读取整个MP3文件
fseek(file, 0, SEEK_SET);
input_buf = malloc(data_size);
fread(input_buf, 1, data_size, file);//初始化minimp3的解码器结构
static mp3dec_t mp3d;
mp3dec_init(&mp3d);//定义mp3dec_frame_info_t
mp3dec_frame_info_t info;
short pcm[MINIMP3_MAX_SAMPLES_PER_FRAME];
int mp3len = 0;//逐帧解码并且播放MP3
int samples = mp3dec_decode_frame(&mp3d, input_buf, data_size, pcm, &info);
while(samples) {play(pcm, samples);mp3len += info.frame_bytes;samples = mp3dec_decode_frame(&mp3d, input_buf + mp3len, data_size - mp3len, pcm, &info);
}free(input_buf);

这样就可以播放整首MP3歌曲了。


本文链接:https://blog.csdn.net/u012028275/article/details/123297598

这篇关于【开源项目】minimp3 MP3解码器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083225

相关文章

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv