使用Delphi的BASS dll创建flac文件或flac流

问题描述 投票:0回答:1

我正和http://www.un4seen.com/一起玩BASS。

我需要创建一个flac文件(16位)或用户在麦克风上讲话的flac流。

我在BASS源代码中看过这个演示。还有一个bassenc_flac.dll以及这些功能:

function BASS_Encode_FLAC_Start(handle:DWORD; options:PChar; flags:DWORD; proc:ENCODEPROCEX; user:Pointer): HENCODE; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; external bassencflacdll;
function BASS_Encode_FLAC_StartFile(handle:DWORD; options:PChar; flags:DWORD; filename:PChar): HENCODE; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; external bassencflacdll;

如何更改下一个代码以将音频编码为flac文件或流?

来自RecordTest BASS演示

(* This is called while recording audio *)
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length: DWORD; user: Pointer): boolean; stdcall;
var level:dword;
begin
    level:=BASS_ChannelGetLevel(Handle);
    // Copy new buffer contents to the memory buffer
    Form1.WaveStream.Write(buffer^, length);
    // Allow recording to continue
    Result := True;
end;

(* Start recording to memory *)
procedure TForm1.StartRecording;
begin
    if ComboBox1.ItemIndex < 0 then Exit;
    if WaveStream.Size > 0 then
    begin   // free old recording
        BASS_StreamFree(chan);
        WaveStream.Clear;
    end;
    // generate header for WAV file
    with WaveHdr do
    begin
        riff := 'RIFF';
        len := 36;
        cWavFmt := 'WAVEfmt ';
        dwHdrLen := 16;
        wFormat := 1;
        wNumChannels := 2;
        dwSampleRate := 44100;
        wBlockAlign := 4;
        dwBytesPerSec := 176400;
        wBitsPerSample := 16;
        cData := 'data';
        dwDataLen := 0;
    end;
    WaveStream.Write(WaveHdr, SizeOf(WAVHDR));
    // start recording @ 44100hz 16-bit stereo
    rchan := BASS_RecordStart(44100, 2, 0, @RecordingCallback, nil);
    if rchan = 0 then
    begin
        MessageDlg('Couldn''t start recording!', mtError, [mbOk], 0);
        WaveStream.Clear;
    end
    else
    begin
        bRecord.Caption := 'Stop';
        bPlay.Enabled := False;
        bSave.Enabled := False;
    end;
end;


(* Stop recording *)
procedure TForm1.StopRecording;
var
    i: integer;
  he:BassEnc.HENCODE;
begin
    BASS_ChannelStop(rchan);
    bRecord.Caption := 'Record';
    // complete the WAV header
    WaveStream.Position := 4;
    i := WaveStream.Size - 8;
    WaveStream.Write(i, 4);
    i := i - $24;
    WaveStream.Position := 40;
    WaveStream.Write(i, 4);
    WaveStream.Position := 0;
    // create a stream from the recorded data
    chan := BASS_StreamCreateFile(True, WaveStream.Memory, 0, WaveStream.Size, 0);
    if chan <> 0 then
    begin
        // enable "Play" & "Save" buttons
        bPlay.Enabled := True;
        bSave.Enabled := True;
    end
    else
        MessageDlg('Error creating stream from recorded data!', mtError, [mbOk], 0);
    if SaveDialog.Execute then
       WaveStream.SaveToFile(SaveDialog.FileName);

end;
delphi audio encode flac bass
1个回答
1
投票

由于显示以前编码器版本的错误工作的注释,我更新了代码。我完全赞同这些评论。

为了创建一个FLAC编码器,我们应该去un4seen网站下载下一个文件:

  1. BASS音频库2.4
  2. BASSFLAC 2.4.4
  3. BASSenc 2.4.14
  4. BASSenc_FLAC 2.4.1.1

浏览这些文件夹并查找下一个文件:

  1. bass.pas
  2. bassenc.pas
  3. bassenc_flac.pas

现在将这些pas文件放在一个文件夹中,然后通过Library选项将其添加到Delphi's。 在此步骤创建新项目后,将其保存在单独的文件夹中。 然后浏览BASS_XXX文件夹并查找*.dll文件。 将它们组合在您保存项目的文件夹中!

现在让我们写一些代码。

添加到qazxsw poi条款qazxsw poi,qazxsw poi和qazxsw poi。然后复制下面显示的代码。

uses

一个通知: 实际上,使用以前版本的代码编码的文件具有不正确的标题(我可以在bass.pas中打开文件时看到它)。代码更新后,我可以看到有效的标题(当然,在记事本中,因为我没有专业的乐器来处理音频文件)。 现在你甚至没有必要像我之前那样为bassenc.pas添加插件。因为我认为编码器按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.