【发布时间】:2023-03-15 09:44:01
【问题描述】:
我正在使用来自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;
【问题讨论】:
-
你好,路易斯!也许,您应该查看
Bass帮助(如果存在)BASS_Encode_FLAC_Start和BASS_Encode_FLAC_StartFile实际执行的功能。我看不出这些函数与您提供的那段代码之间有任何关系。 -
@Dima 我在 BASS 论坛中没有找到有关如何使用它的示例或更多信息。
-
当然,有些人已经处理过
Bass和FLAC编码,但是虽然他们不在这里,但我建议您阅读Bass库的帮助。我发现了什么(我可以理解Bass的帮助):调用BASS_Encode_FLAC_Start函数并指定回调函数。转到此help link 并阅读与FLAC相关的所有信息。 How to prepare callback-function. -
我希望你对
Bass库足够熟悉,可以自己做所有的事情,否则这将不是一件容易的事(根据我对那个库的一点经验编写它过去)。 -
不,我不熟悉 BASS。我只是在使用演示。演示具有回调实现。我需要生成音频文件以发送到谷歌语音识别。
标签: delphi audio encode flac bass