📄 mp3export.pas
字号:
unit MP3export;interfaceUses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;type//type definitions//typedef unsigned long HBE_STREAM;//typedef HBE_STREAM *PHBE_STREAM;//typedef unsigned long BE_ERR; THBE_STREAM = LongWord; PHBE_STREAM = ^PHBE_STREAM; BE_ERR = LongWord;const// encoding formats//#define BE_CONFIG_MP3 0//#define BE_CONFIG_LAME 256 BE_CONFIG_MP3 = 0; BE_CONFIG_LAME = 256;// error codes//#define BE_ERR_SUCCESSFUL 0x00000000//#define BE_ERR_INVALID_FORMAT 0x00000001//#define BE_ERR_INVALID_FORMAT_PARAMETERS 0x00000002//#define BE_ERR_NO_MORE_HANDLES 0x00000003//#define BE_ERR_INVALID_HANDLE 0x00000004BE_ERR_SUCCESSFUL: LongWord = 0;BE_ERR_INVALID_FORMAT: LongWord = 1;BE_ERR_INVALID_FORMAT_PARAMETERS: LongWord = 2;BE_ERR_NO_MORE_HANDLES: LongWord = 3;BE_ERR_INVALID_HANDLE: LongWord = 4;// other constantsBE_MAX_HOMEPAGE = 256;// format specific variablesBE_MP3_MODE_STEREO = 0;BE_MP3_MODE_DUALCHANNEL = 2;BE_MP3_MODE_MONO = 3;type TMP3 = packed record dwSampleRate : LongWord; byMode : Byte; wBitRate : Word; bPrivate : LongWord; bCRC : LongWord; bCopyright : LongWord; bOriginal : LongWord; end; TLHV1 = packed record // STRUCTURE INFORMATION dwStructVersion: DWORD; dwStructSize: DWORD; // BASIC ENCODER SETTINGS dwSampleRate: DWORD; // ALLOWED SAMPLERATE VALUES DEPENDS ON dwMPEGVersion dwReSampleRate: DWORD; // DOWNSAMPLERATE, 0=ENCODER DECIDES nMode: Integer; // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO dwBitrate: DWORD; // CBR bitrate, VBR min bitrate dwMaxBitrate: DWORD; // CBR ignored, VBR Max bitrate nQuality: Integer; // Quality setting (NORMAL,HIGH,LOW,VOICE) dwMpegVersion: DWORD; // MPEG-1 OR MPEG-2 dwPsyModel: DWORD; // FUTURE USE, SET TO 0 dwEmphasis: DWORD; // FUTURE USE, SET TO 0 // BIT STREAM SETTINGS bPrivate: LONGBOOL; // Set Private Bit (TRUE/FALSE) bCRC: LONGBOOL; // Insert CRC (TRUE/FALSE) bCopyright: LONGBOOL; // Set Copyright Bit (TRUE/FALSE) bOriginal: LONGBOOL; // Set Original Bit (TRUE/FALSE_ // VBR STUFF bWriteVBRHeader: LONGBOOL; // WRITE XING VBR HEADER (TRUE/FALSE) bEnableVBR: LONGBOOL; // USE VBR ENCODING (TRUE/FALSE) nVBRQuality: Integer; // VBR QUALITY 0..9 btReserved: array[0..255] of Byte; // FUTURE USE, SET TO 0 end; TAAC = packed record dwSampleRate : LongWord; byMode : Byte; wBitRate : Word; byEncodingMethod : Byte; end; TFormat = packed record case byte of 1 : (mp3 : TMP3); 2 : (lhv1 : TLHV1); 3 : (aac : TAAC); end; TBE_Config = packed record dwConfig : LongWord; format : TFormat; end; PBE_Config = ^TBE_Config;//typedef struct {// // BladeEnc DLL Version number//// BYTE byDLLMajorVersion;// BYTE byDLLMinorVersion;//// // BladeEnc Engine Version Number//// BYTE byMajorVersion;// BYTE byMinorVersion;//// // DLL Release date//// BYTE byDay;// BYTE byMonth;// WORD wYear;//// // BladeEnc Homepage URL//// CHAR zHomepage[BE_MAX_HOMEPAGE + 1];////} BE_VERSION, *PBE_VERSION; TBE_Version = record byDLLMajorVersion : Byte; byDLLMinorVersion : Byte; byMajorVersion : Byte; byMinorVersion : Byte; byDay : Byte; byMonth : Byte; wYear : Word; zHomePage : Array[0..BE_MAX_HOMEPAGE + 1] of Char; end; PBE_Version = ^TBE_Version;//__declspec(dllexport) BE_ERR beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream);//__declspec(dllexport) BE_ERR beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput);//__declspec(dllexport) BE_ERR beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput);//__declspec(dllexport) BE_ERR beCloseStream(HBE_STREAM hbeStream);//__declspec(dllexport) VOID beVersion(PBE_VERSION pbeVersion);{Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Bladeenc.dll';//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll';Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; cdecl 'Bladeenc.dll';Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll';Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; cdecl; external 'Bladeenc.dll';Procedure beVersion(var pbeVersion: TBE_VERSION); cdecl; external 'Bladeenc.dll';}Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Lame_enc.dll';//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll';Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll';Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll';Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; cdecl; external 'Lame_enc.dll';Procedure beVersion(var pbeVersion: TBE_VERSION); cdecl; external 'Lame_enc.dll';Procedure EncodeWavToMP3(fs, fd: Integer);implementationUses InternetSnd, TraiteWav;{----------------------------------------}Procedure EncodeWavToMP3(fs, fd: Integer);var err: Integer; beConfig: TBE_Config; dwSamples, dwSamplesMP3 : LongWord; hbeStream : THBE_STREAM; error: BE_ERR; pBuffer: PSmallInt; pMP3Buffer: PByte; Marque:PChar; done: LongWord; dwWrite: LongWord; ToRead: LongWord; ToWrite: LongWord; i:Integer;begin beConfig.dwConfig := BE_CONFIG_LAME;{ beConfig.Format.mp3.dwSampleRate := WavInfo.SamplesPerSec; beConfig.Format.mp3.byMode := BE_MP3_MODE_STEREO; beConfig.Format.mp3.wBitrate := strToInt(MainFrm.Mp3BitRate.Text); beConfig.Format.mp3.bCopyright := 0; beConfig.Format.mp3.bCRC := $00000000; beConfig.Format.mp3.bOriginal := 0; beConfig.Format.mp3.bPrivate := 0;}//Structure information beConfig.Format.lhv1.dwStructVersion := 1; beConfig.Format.lhv1.dwStructSize := SizeOf(beConfig);//Basic encoder setting beConfig.Format.lhv1.dwSampleRate := WavInfo.SamplesPerSec; beConfig.Format.lhv1.dwReSampleRate := 44100; beConfig.Format.lhv1.nMode := BE_MP3_MODE_STEREO; beConfig.Format.lhv1.dwBitrate := strToInt(MainFrm.Mp3BitRate.Text); beConfig.Format.lhv1.dwMaxBitrate := strToInt(MainFrm.Mp3BitRate.Text); beConfig.Format.lhv1.nQuality := 2; beConfig.Format.lhv1.dwMPegVersion := 1; //MPEG1 beConfig.Format.lhv1.dwPsyModel := 0; beConfig.Format.lhv1.dwEmphasis := 0;//Bit Stream Settings beConfig.Format.lhv1.bPrivate := False; beConfig.Format.lhv1.bCRC := False; beConfig.Format.lhv1.bCopyright := True; beConfig.Format.lhv1.bOriginal := True;//VBR Stuff beConfig.Format.lhv1.bWriteVBRHeader := false; beConfig.Format.lhv1.bEnableVBR := false; beConfig.Format.lhv1.nVBRQuality := 0; i := 0; error := beInitStream(beConfig, dwSamples, dwSamplesMP3, hbeStream); if error = BE_ERR_SUCCESSFUL then begin pBuffer := AllocMem(dwSamples*2); pMP3Buffer := AllocMem(dwSamplesMP3); try done := 0; error := FileSeek(fs, 0, 0); While (done < TotalSize) do begin if (done + dwSamples*2 < TotalSize) then ToRead := dwSamples*2 else begin ToRead := TotalSize-done; //FillChar(buf[0],dwSamples*2,0); FillChar(pbuffer^,dwSamples,0); end; //if FileRead(fs, buf[0], toread) = -1 if FileRead(fs, pbuffer^, toread) = -1 then raise Exception.Create('Erreur de lecture'); //error := beEncodeChunk(hbeStream, toRead div 2, Buf[0], TmpBuf[0], toWrite); error := beEncodeChunk(hbeStream, toRead div 2, pBuffer^, pMP3Buffer^, toWrite); if error <> BE_ERR_SUCCESSFUL then begin beCloseStream(hbeStream); raise Exception.Create('Echec de l''encodage'); end; //if FileWrite(fd, TmpBuf[0], toWrite) = -1 if FileWrite(fd, pMP3Buffer^, toWrite) = -1 then raise Exception.Create('Erreur d''閏riture'); done := done + toread; inc(i); if i mod 64 = 0 then begin MainFrm.ProgressBar1.Position := round(100*done/Totalsize); Application.ProcessMessages; end; end; error := beDeInitStream(hbeStream, pMP3Buffer^, dwWrite); //error := beDeInitStream(hbeStream, TmpBuf[0], dwWrite); if error <> BE_ERR_SUCCESSFUL then begin beCloseStream(hbeStream); raise Exception.Create('Echec
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -