【开源项目】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

相关文章

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

局域网内vue2 配置本地IP地址访问项目

在日常开发中同事可能需要访问你的前端项目,可以通过配置实现通过ip访问 一.首先找到config文件夹目录下的 index.js文件             将此处的host的值修改为0.0.0.0(即 host: 0.0.0.0) // Various Dev Server settings//host: 'localhost' //将localhost进行替换成 0.0.0.0host:

把Tiled中做出的地图弄到项目中~~就是懒,为了以后直接复制写过来

1.现在.h中声明private: cocos2d::CCSprite* ninja; cocos2d::CCTMXTiledMap*  tileMap; 然后.cpp中加入tileMap = CCTMXTiledMap::create("MyTileMap.tmx"); CCTMXLayer* backLayer = tileMap->layerNamed("Tile L

CocoStudio中的UI弄到项目中

1、   与alpah版相比,beta版中更改了创建的脚本,可以自定义项目的目录,接下来我们看看。先上图: 2、项目创建     找到 cocos2dx根目录/tools/project-creator/create_project.py文件,双击运行即可。如果未安装python环境,则需要下载安装。脚本运行起来,会显示一个图形界面,用以设置相应的项目