delphi - 使用带有Delphi的BASS dll创建flac文件或flac流

标签 delphi audio encode flac bass

我正在使用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;

最佳答案

我已更新代码,因为注释显示以前的编码器版本工作不正确。我完全同意这些评论。

为了创建FLAC编码器,我们应该访问un4seen网站并下载以下文件:

  • BASS音频库2.4
  • BASSFLAC 2.4.4
  • BASSenc 2.4.14
  • BASSenc_FLAC 2.4.1.1

  • 浏览这些文件夹并查找下一个文件:
  • bass.pas
  • bassenc.pas
  • bassenc_flac.pas

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

    现在让我们编写一些代码。

    usesbass.pasbassenc.pas添加到bassenc_flac.pas子句中。然后复制下面显示的代码。
      uses ..., BASS, BASSEnc, BASSEnc_FLAC;
    
      ...
    
      TForm1 = class(TForm)
        ProgressBar1: TProgressBar;      
      public
        { Public declarations }
        procedure StartEncode(SourceFileName, OutputFileName: String);
        procedure StopEncode;
      end;
    
    ...
    
    procedure TForm1.StartEncode(SourceFileName, OutputFileName: String);
    var
      PercentDone: Cardinal;
      Buffer: array [0..1024] of Byte;
    begin
      Channel := BASS_StreamCreateFile(false, PChar(SourceFileName), 0, 0, BASS_MUSIC_DECODE or BASS_UNICODE);
      BASSEnc_FLAC.BASS_Encode_FLAC_StartFile(Channel, 0, BASS_ENCODE_FP_AUTO or BASS_UNICODE, PChar(OutputFileName));
      while BASS_ChannelIsActive(Channel) > 0 do
      begin
        BASS_ChannelGetData(Channel, @Buffer, 1024);
        PercentDone := Trunc(100 * (BASS_ChannelGetPosition(Channel, BASS_POS_BYTE) / BASS_ChannelGetLength(Channel, BASS_POS_BYTE)));
        ProgressBar1.Position := PercentDone;
      end;
      StopEncode;
    end;
    
    procedure TForm1.StopEncode;
    begin
      BASS_Encode_Stop(Channel);
      BASS_StreamFree(Channel);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      BASS_Init(-1, 44100, 0, Application.Handle, nil);
      try   
        // Set name of file to convert it to FLAC and save it with output name
        StartEncode('SourceFileName', 'OutputFileName');
      finally
        BASS.BASS_Free;
      end;
    end;
    

    一条通知:
    确实,使用以前版本的代码编码的文件具有错误的 header (在Notepad.exe中打开文件时,我可以看到它)。更新代码后,我可以看到有效的 header (当然,在记事本中,因为我没有使用音频文件的专业工具)。
    现在,您甚至不需要像我之前那样将插件添加到BASS中。
    因此,我认为编码器可以按预期工作。

    关于delphi - 使用带有Delphi的BASS dll创建flac文件或flac流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52236347/

    相关文章:

    javascript - Javascript(js)是如何加密和解密的?

    PHP JSON 编码使用逗号和括号

    ios - iOS-如何使录制的音频文件变小(就像微信一样)?

    python - 从录音中确定音质?

    delphi - 仅对某些类启用 Delphi XE RTTI

    Delphi 网格每行具有不同的数据类型,动态显示

    javascript - 每页上的音量按钮控制

    PHP urlencode - 仅对文件名进行编码并且不要触摸斜杠

    delphi - 我应该引用字段或属性名称吗?

    delphi - 如何解析证书主题字符串?