MT7688: Shine定点MP3压缩库试验

本文介绍如何使用Shine库实现高效的MP3压缩,特别适用于MT7688等无FPU处理器。通过示例代码展示如何配置参数并完成从原始PCM数据到MP3文件的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     Shine是一款开源的定点MP3压缩软件,特别适合没有FPU的MT7688来进行PCM数据的压缩。编制了一段小程序来试验一下 Shine库的应用,发现压缩的速度还是非常快的!

说明:

1. 先用arecord录制一段RAW(PCM)语音,采样率为8k, S16_LE模式, 也可以是其他格式的,程序中sh_config.wave.samplerate做相应修改。

2. 注意sh_config.wave.samplerate 和 sh_config.mpeg.bitr 一定要匹配。



------------------------------------------------------- shine_test.c ---------------------------------------------------------------------


#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
#include "layer3.h"

/*================================================================================
                              ---- ( MAIN ) ----
================================================================================*/
int main(int argc,char* argv[])
{
FILE *fin,*fout;
int16_t pcm_buff[2*SHINE_MAX_SAMPLES];
int16_t *ppbuff=pcm_buff;
unsigned char* data_out=NULL;
int count=0;
int chanl_samples_per_pass; // samples per channel to feed the encoder each time.
int samples_per_pass; //  =chanl_samples_per_pass*nchanl
shine_t sh_shine;
shine_config_t sh_config;
int nchanl=1; //MONO
int nread=0;
int nwrite=0;


char str_fin[]="/tmp/8k.raw";
char str_fout[]="/tmp/8k.mp3";

//--------初始化config.mpeg结构 ------
shine_set_config_mpeg_defaults(&(sh_config.mpeg)); //--init sh_config struct

//-------- 配置 config 结构 -------------
sh_config.wave.channels=PCM_MONO; //PCM_STEREO;//PCM_MONO;
sh_config.wave.samplerate=8000;//valid samplerates: 44100,48000,32000,22050,24000,16000,11025,12000,8000
sh_config.mpeg.copyright=1;
sh_config.mpeg.original=1;
sh_config.mpeg.mode=MONO;//STEREO;//MONO;
sh_config.mpeg.bitr=8; //64kbps for 16k //32kbps for 8k samplerate


//-------- 检查samplerate和bit rate是否匹配  -----------
if(shine_check_config(sh_config.wave.samplerate,sh_config.mpeg.bitr)<0)
printf("Unsupported samplerate/bitrate configuration.\n");


//---------  初始化shine  ---------------
sh_shine=shine_initialise(&sh_config);
if(sh_shine == NULL){
printf("Fail to init shine!\n");
exit(-1);
  }

//-------  每次需要喂给shine进行压缩的的采样数 ---------------
chanl_samples_per_pass=shine_samples_per_pass(sh_shine);//numbers of samples(per channel) to feed to the encoder for each encoding session
printf("---- shine one channle samples per pass %d\n",chanl_samples_per_pass);
printf("---- shine bitrate:%d kbps\n",sh_config.mpeg.bitr);
samples_per_pass=chanl_samples_per_pass*nchanl;
printf("samples_per_pass=%d\n",samples_per_pass);fin=fopen(str_fin,"rb");

//--------------- 打开文件读写 ------------
if(fin == NULL){
printf("fail to open input file!\n");
exit(-1);
 }
fout=fopen(str_fout,"wb");
if(fout == NULL){
printf("fail to open output file!\n");
exit(-1);
 }

printf("start encoding ...\n");
while(nread=fread(pcm_buff,sizeof(int16_t),samples_per_pass,fin))
{
if(nread < samples_per_pass){  //---小于喂给采样数时,剩余用0填充
printf("nread < samples_per_pass! nread = %d\n",nread);
memset(pcm_buff+nread,0,(samples_per_pass-nread)*sizeof(int16_t));
}
//------ unsigned char *shine_encode_buffer(shine_t s,int16_t **data, int *written);
//------ unsigned cahr *shine_encode_buffer_interleaved(shinet_t s, int16_t *data, int *written);
data_out=shine_encode_buffer(sh_shine,&ppbuff,&count);
nwrite=fwrite(data_out,sizeof(unsigned char),count,fout);// count=number of data_chunk been written, here is 1  (not bytes!)
}

//-------- 把shine中剩余的数据压缩后读出-----------
data_out=shine_flush(sh_shine,&count);
fwrite(data_out,sizeof(unsigned char),count,fout);// count=number of data_chunk been written, here is 1  (not bytes!)

//--- - close encoder  --
shine_close(sh_shine);
//----close file -----
close(fin);
close(fout);
return 1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Midas-Zhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值