【问题标题】:Reduce delay before audio file plays减少音频文件播放前的延迟
【发布时间】:2019-03-09 08:22:48
【问题描述】:

我有一个包含三个按钮组件的 delphi VCL 表单。单击按钮后,将播放与该特定按钮关联的短 4 秒音频文件 .wav(在资源文件中)。

在程序打开后第一次单击按钮时,播放开始前会出现约 1/2 秒的烦人延迟。在播放文件后的 5 秒左右内单击按钮不会发生这种延迟,尽管延迟会以更长的间隔重复出现。在当前播放的文件完成之前单击按钮中断播放也不会产生延迟。

我怎样才能摆脱这些延迟,或者至少大幅减少它们?声音文件本身没有静音导入。这是代码(Delphi 社区版):

unit Unit8;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm8 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
  public
  end;
var
  Form8: TForm8;

implementation
{$R *.dfm}

procedure TForm8.Button1Click(Sender: TObject);
begin
PlaySound('Resource_1', HInstance, SND_RESOURCE or SND_NODEFAULT or SND_ASYNC or SND_SENTRY);
end;

procedure TForm8.Button2Click(Sender: TObject);
begin
PlaySound('Resource_2', HInstance, SND_RESOURCE or SND_NODEFAULT or SND_ASYNC or SND_SENTRY);
end;

procedure TForm8.Button3Click(Sender: TObject);
begin
PlaySound('Resource_3', HInstance, SND_RESOURCE or SND_NODEFAULT or SND_ASYNC or SND_SENTRY);
end;
end.

【问题讨论】:

  • 您没有指定 .wav 文件的大小。这会显着影响加载时间

标签: delphi audio latency


【解决方案1】:

每次播放时,您实际上是在要求 Windows 从 .EXE 文件重新加载 .WAV 数据。这将需要一些时间,除非数据仍在缓存中(这就是为什么如果您等待足够长的时间以使数据从缓存中“抛出”则需要更长的时间 - 然后 Windows 必须从.EXE 文件)。

因此,您应该在自己的应用程序启动时(FormCreate)缓存一次数据,然后在播放声音时使用缓存的数据。

使用此函数将资源读入TBytes

FUNCTION LoadResource(CONST ResourceName : STRING) : TBytes;
  VAR
    S   : TStream;
    SZ  : Int64;

  BEGIN
    S:=TResourceStream.Create(HInstance,ResourceName,RT_RCDATA);
    TRY
      SZ:=S.Size;
      SetLength(Result,SZ);
      S.Read(Result,0,SZ)
    FINALLY
      FreeAndNIL(S)
    END
  END;

然后用这个函数作为基础来播放声音:

FUNCTION PlayWAV(CONST Data : TBytes ; Flags : UINT = SND_ASYNC) : BOOLEAN;
  BEGIN
    Result:=sndPlaySound(PChar(Data),Flags OR SND_MEMORY)
  END;

【讨论】:

  • 非常感谢:解答了问题并说明了原因!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多