cutamr.c

来自「arena SDK开发应用」· C语言 代码 · 共 55 行

C
55
字号
#include <string.h>
#include "CutAmr.h"

#define NWAVBUFLENG 1000000
unsigned char outBuf[NWAVBUFLENG];

int CutAmrNB(char *szAmrName, char *szSubAmrName, unsigned long int nStartTime, unsigned long int nEndTime)
{
	unsigned int nFrameLeng ;//每帧包含的字节数
	long int nByteLeng ,nStartPoint;
	char magic[8];
	short block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
    unsigned char analysis[32];
	FILE *fAmr = fopen(szAmrName,"rb");
	FILE *fSubAmr = fopen(szSubAmrName,"wb");
	if ((!fAmr)||(!fSubAmr))
		return -1;

   fread( magic, sizeof( char ), strlen( AMR_MAGIC_NUMBER ), fAmr );
  
  //判断文件的格式
	if ( strncmp( magic, AMR_MAGIC_NUMBER, strlen( AMR_MAGIC_NUMBER ) ) ) 
		{
			 fclose( fAmr );
			 fclose( fSubAmr );
			 return 1;
		}
		
	nStartTime /=20;
	nEndTime /=20;
	nStartTime *=20;
	nEndTime *=20;
	if(nStartTime<0 || nStartTime>=nEndTime) return 3;
		
	//Start Cut	
  fseek(fAmr,0,SEEK_SET);	
  fread(outBuf,1,strlen( AMR_MAGIC_NUMBER ),fAmr);
  fread(analysis, sizeof (unsigned char), 1, fAmr );
  
  nFrameLeng = ((analysis[0] >> 3) & 0x000F) ;
  nFrameLeng = block_size[nFrameLeng]+1;
  nByteLeng = (nEndTime - nStartTime ) * nFrameLeng / 20 ;
  nStartPoint = nFrameLeng * nStartTime / 20 ; 	
  fseek(fAmr,nStartPoint + strlen( AMR_MAGIC_NUMBER ),SEEK_SET);
  fread(outBuf+6,1,nByteLeng,fAmr);
	
  if(!fwrite(outBuf, 1, nByteLeng + strlen( AMR_MAGIC_NUMBER ), fSubAmr))
     return 2;

  fclose(fAmr);
  fclose(fSubAmr);

  return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?