• 操作 Wave 文件(8): 使用 TMediaPlayer 录制 wav 文件



    TMediaPlayer 录音是基于一个已存在的 wav 文件, 上次建立空白 wav 的函数可派上用场了.

    TMediaPlayer 的功能是基于 MCI 的, 都是该淘汰的东西了, 只是简单了解下.

    接下来还要学习用 waveIn...系列函数录音、用 DirectSound 录音.

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, MPlayer, StdCtrls;
    
    type
      TForm1 = class(TForm)
        MediaPlayer1: TMediaPlayer;
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses MMSystem;
    
    //建立一个空白 Wave 文件的函数
    function CreateWav(chan, freq, bit: Word; const FilePath: string): Boolean;
    var
      h: HMMIO;
      ckiRiff, ckiFmt, ckiData: TMMCKInfo;
      fmt: TPCMWaveFormat;
    begin
      ZeroMemory(@ckiRiff, SizeOf(TMMCKInfo));
      ckiRiff.cksize := 36;
      ckiRiff.fccType := mmioStringToFOURCC('WAVE', 0);
    
      ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));
      ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);
    
      ZeroMemory(@ckiData, SizeOf(TMMCKInfo));
      ckiData.ckid := mmioStringToFOURCC('data', 0);
    
      fmt.wf.wFormatTag := WAVE_FORMAT_PCM;
      fmt.wf.nChannels := chan;
      fmt.wf.nSamplesPerSec := freq;
      fmt.wf.nAvgBytesPerSec := freq * chan * bit div 8;
      fmt.wf.nBlockAlign := chan * bit div 8;
      fmt.wBitsPerSample := bit;
    
      h := mmioOpen(PChar(FilePath), nil, MMIO_CREATE or MMIO_WRITE);
      if h = 0 then Exit(False);
    
      if (mmioCreateChunk(h, @ckiRiff, MMIO_CREATERIFF) = MMSYSERR_NOERROR) and
        (mmioCreateChunk(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and
        (mmioWrite(h, PAnsiChar(@fmt), SizeOf(TPCMWaveFormat)) = SizeOf(TPCMWaveFormat)) and
        (mmioAscend(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and
        (mmioCreateChunk(h, @ckiData, 0) = MMSYSERR_NOERROR) then Result := True;
    
      mmioClose(h, 0);
    end;
    
    //文件路径
    const path = 'C:\Temp\Test.wav';
    
    //开始录音
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      CreateWav(2, 22050, 16, path);
    
      MediaPlayer1.FileName := path;
      MediaPlayer1.Open;
      MediaPlayer1.StartRecording;
    
      Button2.Enabled := True;
    end;
    
    //停止录音并播放
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      MediaPlayer1.Stop;
      MediaPlayer1.Play;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      MediaPlayer1.Visible := False;
      Button2.Enabled := FileExists(path);
    end;
    
    end.
    
  • 相关阅读:
    10分钟入门spark
    10分钟入门kubernetes(上)
    深入浅出Hadoop之mapreduce
    深入浅出Hadoop之HDFS
    闲聊cassandra
    深入浅出zookeeper
    Asp.net日期字符串格式化显示
    C#里面比较时间大小三种方法
    (ASP.net)利用Application对象制作简单聊天室
    Response.ContentType 详细列表
  • 原文地址:https://www.cnblogs.com/del/p/1599835.html
Copyright © 2020-2023  润新知