⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.pas.~89~

📁 将WAVE格式文件转换成OGG格式,程序中的动态库为OGG最新源代码修改后得出,如需要请联系我。
💻 ~89~
字号:
unit mainfrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,mmsystem;

type
  POggEncMsg=^OggEncMsg;
  OggEncMsg=packed record
    Mark      :integer;
    lpBuffer  :PByte;
    BufferSize:Integer;
    lpOutBuffer     :PByte;
    OutBufferMaxSize:Integer;
    OutBufferSize   :Integer;
  end;


  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    BitBtn1: TBitBtn;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  function ogg_encode_init(lpMsg:PChar):Integer;stdcall;external 'E:\软件\源代码\OGG相关\oggenc2.85srcs_改2\oggenc2\RT_Opt\_oggenc2.dll' ;
  function ogg_encode_do(lpMsg:PChar):Integer;stdcall;external 'E:\软件\源代码\OGG相关\oggenc2.85srcs_改2\oggenc2\RT_Opt\_oggenc2.dll';
  function ogg_encode_free(lpMsg:PChar):Integer;stdcall;external 'E:\软件\源代码\OGG相关\oggenc2.85srcs_改2\oggenc2\RT_Opt\_oggenc2.dll';
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
const
  TempBufferLenght=512;
  TempOutBufferLength=512*20;
var
  Buffer:Array[0..TempOutBufferLength-1]of Byte;
  SrcFileName,DestFileName:String;
  OggSize,nRet,nSize:Integer;
  pmsg:POggEncMsg;

  fsSrc,fsDest:TFileStream;
  //ptmp:PByte;
begin

  SrcFileName := edit1.Text;
  if not FileExists(SrcFileName) then
  begin
    showmessage('file not found:'+srcFileName);
    exit;
  end;
  DestFileName :=Copy(SrcFileName,1,length(SrcFileName)-4)+'.ogg';
  if FileExists(DestFileName) then
    DeleteFile(DestFileName);


	fsSrc  := TFileStream.Create(SrcFileName,fmOpenRead or fmShareDenyNone);
	fsDest := TFileStream.Create(DestFileName,fmCreate);

  new(pmsg);
  FillMemory(pmsg,sizeof(pmsg^),0);
	pmsg.lpBuffer    := PByte(StrAlloc(TempBufferLenght));
	pmsg.lpOutBuffer := PByte(StrAlloc(TempOutBufferLength));
	pmsg.OutBufferMaxSize:=TempOutBufferLength;

  // 1.初始化
  fsSrc.Seek(20,0);
  fsSrc.Read(Buffer,sizeof(tWAVEFORMATEX));
  ptmp := pmsg.lpBuffer;
  copymemory(pmsg.lpBuffer,@Buffer,sizeof(tWAVEFORMATEX));
  pmsg.Mark := 0;
  pmsg.BufferSize := sizeof(tWAVEFORMATEX);
  nRet := ogg_encode_init(pchar(pmsg));
  if nRet <> 0  then
    exit;

  copymemory(@Buffer,pmsg.lpOutBuffer,pmsg.OutBufferSize);
  if pmsg.OutBufferSize>0 then
    fsDest.Write(Buffer,pmsg.OutBufferSize);

  while fsSrc.Position < fsSrc.Size do
  begin
    nSize :=fsSrc.Read(Buffer,TempBufferLenght);
    ptmp := pmsg.lpBuffer;
    copymemory(pmsg.lpBuffer,@Buffer,nSize);
    if nSize >0  then
    begin
      pmsg.Mark := 1;
      pmsg.BufferSize := nSize;
      pmsg.OutBufferMaxSize:=TempOutBufferLength;
      nRet := ogg_encode_do(pchar(pmsg));
      if nRet <> 0  then exit;

      copymemory(@Buffer,pmsg.lpOutBuffer,pmsg.OutBufferSize);
      if pmsg.OutBufferSize>0 then
        fsDest.Write(Buffer,pmsg.OutBufferSize);
    end;
  end;

  pmsg.Mark :=2;
	ogg_encode_free(pchar(pmsg));
  fsSrc.Free;
  fsDest.Free;

  StrDispose(PChar(pmsg.lpBuffer));
  StrDispose(PChar(pmsg.lpOutBuffer));
  Dispose(pmsg);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    edit1.Text := OpenDialog1.FileName;
end;

end.

⌨️ 快捷键说明

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