现在的位置: 首页 > 综合 > 正文

Delphi 多媒体(Tmediaplayer 3)

2018年02月06日 ⁄ 综合 ⁄ 共 3537字 ⁄ 字号 评论关闭
文章目录

录制波形音频(Recording Wave Audio)

录制波形音频不是像大家想象的直接,也许大家以为所要做的就是调用StartRecording方法。然而,因为TMediaPlayer的问题,它不是那么简单的。

录制波形文件,首先必须打开一个存在的波形文件,这个波形文件和所想要的新文件有相同的录制参数,然后开始录制新的波形文件,改变FileName属性为新文件名,然后保存文件,这有点笨拙,但其作用。

例如,假设有一个叫做Test.wav文件,这个文件以8000Hz,采样率16位且为单声道的波形格式录制,这时可以像下面代码那样在按钮上点击录制波形音频:

1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.btn6Click(Sender: TObject);
begin
  with mpPlayer do
  begin
    { 设置FileName属性为 test.wav 文件,并从中获取录制参数信息}
    FileName := 'test.wav';
    { 打开设备}
    Open;
    { 开始录制}
    Wait := False;
    StartRecording;
  end;
end;

此时录制已经开始,并且控制已返回应用程序。现在需要停止录制,这可以通过第二个停止按钮来完成,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.btn7Click(Sender: TObject);
begin
  with mpPlayer do
  begin
    { 停止录音}
    Stop;
    { 改变FileName属性为新的文件名用来保存到硬盘}
    FileName := 'new.wav';
    { 保存并关闭文件}
    Save;
    Close;
  end;
end;

Note

在上面的编写过程中,因为TMediaPlayer中的故障,这些步骤对于波形音频的录制是很必要的。TMediaPlayer 录音是基于一个已存在的 wav 文件,TMediaPlayer 的功能是基于 MCI 的, 都是该淘汰的东西了, 但是我们还是要进行了解。

控制波形音频录制的因素包括采样位数(通常为8或16)、采样频率和声道数,通常采样频率为8000kHz、11025kHz、22050kHz以及44100kHz,采样频率越高,录制质量越好。大部分情况下,用户可能不使用立体声,除非做游戏程序设计。即使做游戏程序设计,也应根据需要使用立体声。采样位数也影像录音质量。

Note

声音质量越好,录制波形音频文件占用的磁盘空间越多。立体声录音的文件大小是单声道录音文件的两倍。同样地,使用采样位数16位的文件大小会使采样位数8位的两倍。以22050kHz、单声道采样位数8位录制的文件可能是200K,而同样的文件以22050kHz、立体声且采样16位进行录制录制的文件大小将会是800K。大部分情况下,立体声和16位采样相对于它所需要的额外磁盘空间开销是不一定合算的。权衡声音质量和文件大小,22050kHz、单声道、8位采样的波形文件是一个很好的选择。

 

MIDI音频(MIDI Audio)

对于MIDI音频没有太多可说的,所要做的只是设置MediaPlayer的FileName属性为MIDI文件,在调用Play方法即可。MIDI文件的扩展名有.mid和.rmi两种。

简单的播放MIDI音频的例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.btn9Click(Sender: TObject);
begin
  if Pos('播放''蜡笔小新''MIDI音乐', btn9.Caption) > 0 then
  begin
    mpPlayer.Wait := False;
    mpPlayer.FileName := 'lbxx.mid';
    mpPlayer.Open;
    mpPlayer.Play;
    btn9.Caption := '停止播放';
  end else
  if Pos('停止播放', btn9.Caption) >0 then
  begin
    mpPlayer.Stop;
    mpPlayer.Close;
    btn9.Caption := '播放''蜡笔小新''MIDI音乐';
  end;
end;

运行效果如下:

Note

如果不想紧紧停留在简单的MIDI文件播放,那么必须学习一些底层的midiInXXX和midiOutXXX函数。这些函数在MMEDIA.HLP文件中有说明,该文件在C:\Program Files (x86)\Common Files\Borland Shared\MSHelp目录下(Win7 64位下的路径,其他系统类似)。

许多早期的声卡不允许同时播放两个波形文件,同样的,也不允许同时播放一个以上的MIDI文件。然而,大多能同时播放波形文件和MIDI文件。大家可能已经在游戏中注意到这种效果,在这些游戏中,同时播放着音乐(music track)和音效(sound effects)。要同时播放波形文件和MIDI文件可使用两个MediaPlayer组件。或者也可以为MIDI文件使用MediaPlayer组件,而需要播放的波形文件使用PlaySound函数

一个简单的例子同时播放MIDI和WAVE音乐如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.btn10Click(Sender: TObject);
begin
  if Pos('同时播放MIDI和WAVE音频', btn10.Caption) > 0 then
  begin
    mpPlayer.Wait := False;
    mpPlayer.FileName := 'lbxx.mid';
    mpPlayer.Open;
    mpPlayer.Play;
    PlaySound('test.wav', 0, SND_FILENAME or SND_ASYNC);
    btn10.Caption := '停止播放';
  end else
  if Pos('停止播放', btn10.Caption) >0 then
  begin
    mpPlayer.Stop;
    mpPlayer.Close;
    PlaySound(0, 0, SND_FILENAME);
    btn10.Caption := '同时播放MIDI和WAVE音频';
  end;
end;


MIDI文件常被用作游戏的背景音乐,如果以这种方式使用MIDI文件,当结束时将要重新启动音乐。TMediaPlayer没有自动方式连续播放声音。然而,利用MediaPlayer的OnNotify事件获得循环效果。首先必须告诉MediaPlayer当发生某事时要发出通知。这部分很容易:

1
mpPlayer.Notify := True; { 当发生某事时触发OnNotify事件}

之后,需要提供OnNotify事件处理代码,在事件处理代码中,需要在MIDI播放成功后重新开始播放,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.mpPlayerNotify(Sender: TObject);
begin
  with mpPlayer do
  begin
    if (NotifyValue = nvSuccessful) and (btn11.Caption = '停止播放') then
    { 同时判断了Btn11按钮的播放状态,确认只对该按钮有效}
    begin
      Position := 0;
      Play;
    end;
  end;
end;

首先检查NotifyValue属性是否包含nvSuccessful值。如果是的话,重新设置文件位置为0,并调用Play方法重新开始播放文件。非常简单,但是有一些要点应该认识。

首先注意这里Position属性设置为0,这有效地使文件恢复到起点上。如果AutoRewind属性设置为True,则不必设置Position属性了。

其次应该注意到一些动作使得MediaPlayer的OnNotify事件被调用,并且将NotifyValue的值改变为nvSuccessful。

例如:一个简单的Stop命令,如果该命令执行完没有发生任何意外的话,Stop命令将会产生nvSuccessful值。用户可能需要建立一个状态机制使得当文件播放完毕后能OnNotify事件被调用,其他一些媒体的播放结束不受此干扰。

以上代码均在Delphi  7下测试通过,示例代码下载:TMediaPlayer.rar

 

抱歉!评论已关闭.