首页
诗词
字典
板报
句子
名言
友答
励志
学校
网站地图
移动开发
移动开发
Android
Iphone
Windows Mobile
Symbian
BlackBerry
QT开发
Brew
MeeGo
移动平台
移动软件开发
电信IT应用开发
移动应用
当前位置:
首页
>
教程频道
>
移动开发
>
移动开发
>
mp3资料解析代码
2012-06-20
mp3文件解析代码头文件:#include mp3.h// bit率128K bit/sstatic int bitrateTbl[16][BITRATE_NUM] {{
mp3文件解析代码
头文件:
#include "mp3.h"// bit率 128K bit/s static int bitrateTbl[16][BITRATE_NUM] ={{ -1, -1},{ 32, 8},{ 40, 16},{ 48, 24},{ 56, 32},{ 64, 40},{ 80, 48},{ 96, 56},{112, 64},{128, 80},{160, 96},{192, 112},{224, 128},{256, 144},{320, 160},{ -1, -1}};// 采样率static int samplingRateTbl[3][SAMPLERATE_NUM] ={{ 44100, 22050, 11025 },{ 48000, 24000, 12000 },{ 32000, 16000, 8000 }};// 检查帧头信息int checkHdr(uint32_t hdr){if( (hdr & MP3_FRAME_SYNC) != MP3_FRAME_SYNC|| ((hdr>>SHIFT_VERSION) & 0x3) == 1|| ((hdr>>SHIFT_LAYER) & 0x3) == 0|| ((hdr>>SHIFT_BITRATE) & 0xf) == 0xf || ((hdr>>SHIFT_BITRATE) & 0xf) == 0|| ((hdr>>SHIFT_SAMPLERATE)&0x3) == 0x3|| (hdr & 0xffff0000) == 0xfffe0000)return 0;return 1;}#define READ_ERROR(ret) if((ret) < 0) return (ret);int READ_CHAR(FILE * fp, uint32_t * v){char buf[1];if(fread(buf, 1, 1, fp) <= 0)return -1;*v = 0xff & buf[0];return 0;}int READ_UINT16(FILE * fp, uint32_t * v){uint32_t tmp;int ret;ret = READ_CHAR(fp, &tmp);READ_ERROR(ret);*v = (tmp << 8);ret = READ_CHAR(fp, &tmp);READ_ERROR(ret);*v |= (tmp);return 0;}int READ_UINT24(FILE * fp, uint32_t * v){uint32_t tmp;int ret;ret = READ_UINT16(fp, &tmp);READ_ERROR(ret);*v = (tmp << 8);ret = READ_CHAR(fp, &tmp);READ_ERROR(ret);*v |= (tmp);return 0;}int READ_UINT32(FILE * fp, uint32_t * v){uint32_t tmp;int ret;ret = READ_UINT24(fp, &tmp);READ_ERROR(ret);*v = (tmp << 8);ret = READ_CHAR(fp, &tmp);READ_ERROR(ret);*v |= (tmp);return 0;}// 解析mp3帧int getNextFrame(FILE * mp3fp, struct mp3_frame * frame){uint32_t hdr, br_idx, sr_idx;int ret;int factor;do{ret = READ_UINT32(mp3fp, &hdr);//ret = fread(&hdr, 4, 1, mp3fp);if (ret < 0)return -1;if (checkHdr(hdr))break;fseek(mp3fp, -3, 1);}while (1);frame->version = (hdr >> SHIFT_VERSION) & 0x3;br_idx = (hdr >> SHIFT_BITRATE) & 0xf;sr_idx = (hdr >> SHIFT_SAMPLERATE) & 0x3;switch(frame->version){case MPEG_25:frame->bitrate = bitrateTbl[br_idx][BITRATE_MPEG2];frame->samplingRate = samplingRateTbl[sr_idx][SAMPLERATE_MPEG25];factor = 72;break;case MPEG_2:frame->bitrate = bitrateTbl[br_idx][BITRATE_MPEG2];frame->samplingRate = samplingRateTbl[sr_idx][SAMPLERATE_MPEG2];factor = 72;break;case MPEG_1:frame->bitrate = bitrateTbl[br_idx][BITRATE_MPEG1];frame->samplingRate = samplingRateTbl[sr_idx][SAMPLERATE_MPEG1];factor = 144;break;default:printf("invalid header %x\n", hdr);return -1;}frame->size = (factor * frame->bitrate * 1000) / frame->samplingRate;if(frame->size == 0){printf("size == 0\n");return -1;}if((hdr & MASK_PADDING) != 0)frame->size++;if(frame->samplingRate > 32000)frame->samples = 1152;elseframe->samples = 576;frame->channel = hdr & MASK_CHANNEL;fseek(mp3fp, -4, 1);return 0;}
查看更多
下一篇
本文网址:
https://www.reader8.net/jiaocheng/20120620/1407682.html
读书人精选
热点排行
ContentProvider 示例
简略说说1月8号的中国首届cocoa移动开发
IntentFilter 引见
NFC一点点体验
iOS NSString的惯用用法
下上文周期应用
java 最好货色
【通译】(39)样式资源
scrollview怎么初始化定位滚动条的位置
git完代码后的异常