delphi的TMediaPlayer控件StartRecording方法可以实现录音,但是该控件只能将录好的音存为wav文件。
我想不通过磁盘文件直接将录好的音存入内存流中?
谁有办法?另外如何直接播放一个内存流中的wav,而不是先存为临时文件,再加载?只要能解决问题,分给多少都没问题!

解决方案 »

  1.   

    为什么要用流那,那样数据的取出存入将会慢,你可以存取。wav的路径,试验一下这个方法,我个人觉得是不错的。你的想法可以实现,但是效果不一定好
      

  2.   

    给你点代码   你看看
    unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, MPlayer, ExtCtrls;type
    TWavHeader = record //定义一个Wav文件头格式
    rId : longint; 
    rLen : longint; 
    wId : longint; 
    fId : longint; 
    fLen : longint; 
    wFormatTag : word; 
    nChannels : word; 
    nSamplesPerSec : longint; 
    nAvgBytesPerSec : longint; 
    nBlockAlign : word; 
    wBitsPerSample : word; 
    dId : longint; 
    wSampleLength : longint; 
    end;
    TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
        Panel1: TPanel;
        Panel2: TPanel;
        btstop: TButton;
        btstart: TButton;
        Label1: TLabel;
        Timer1: TTimer;
    procedure CreateWav(channels : word; resolution : word; rate : longint; fn : string);//自定义写一个Wav文件头过程
    procedure BtStartClick(Sender: TObject);
    procedure BtStopClick(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;
    str11:string;
    implementation{$R *.DFM}procedure TForm1.CreateWav( channels : word; { 1(单声)或者2(立体声) }
    resolution : word; { 8或者16,代表8位或16位声音 }
    rate : longint; { 声音频率,如11025,22050, 44100}
    fn : string { 对应的文件名称 } );
    var
    wf : file of TWavHeader;
    wh : TWavHeader;
    begin
    wh.rId := $46464952; 
    wh.rLen := 36; 
    wh.wId := $45564157; 
    wh.fId := $20746d66; 
    wh.fLen := 16; 
    wh.wFormatTag := 1; 
    wh.nChannels := channels; 
    wh.nSamplesPerSec := rate; 
    wh.nAvgBytesPerSec := channels*rate*(resolution div 8);
    wh.nBlockAlign := channels*(resolution div 8);
    wh.wBitsPerSample := resolution;
    wh.dId := $61746164; 
    wh.wSampleLength := 0; 
    assignfile(wf,fn); {打开对应文件 } 
    rewrite(wf); {移动指针到文件头} 
    write(wf,wh); {写进文件头 } 
    closefile(wf); {关闭文件 } 
    end;procedure TForm1.BtStartClick(Sender: TObject);
    var
    strrr:string;
    yea,mon,day:word;
    h,m,s,ws:word;
    begin
    MediaPlayer1.Enabled:=false;
    MediaPlayer1.Enabled:=true;
    try
    decodedate(date,yea,mon,day);
    decodetime(time,h,m,s,ws);
    strrr:=ExtractFilePath(Application.ExeName)+inttostr(yea)+inttostr(mon)+inttostr(day)+inttostr(h)+inttostr(m)+inttostr(s)+'.wav';//formatdatetime('yyyy-mm-dd',date)+' '+formatdatetime('hh:mm:ss',time)+
    //在程序当前目录下创建一个Wav文件Temp.wav
    CreateWav(1, 8, 11025, strrr); //如果参数设置成2,16,44100 存储的文件大
    panel1.Caption:='正在录制语音';
    timer1.Enabled:=true;
    str11:=formatdatetime('hh:mm:ss',time);
    MediaPlayer1.DeviceType := dtAutoSelect;
    MediaPlayer1.FileName :=strrr;
    MediaPlayer1.Open;
    MediaPlayer1.StartRecording;
    BtStart.Enabled:=false;
    BtStop.Enabled:=true;
    except
    BtStart.Enabled:=True;
    BtStop.Enabled:=false;
    Application.MessageBox('媒体设备初始化失败!','错误',MB_ICONERROR+MB_OK);
    end;
    end;procedure TForm1.BtStopClick(Sender: TObject);
    begin
    try
    panel1.Caption:='停止录音状态';
    timer1.Enabled:=false;
    MediaPlayer1.Stop;
    MediaPlayer1.Save;
    MediaPlayer1.Close;
    Application.MessageBox('声音录制完毕!','信息',MB_ICONINFORMATION+MB_OK);
    BtStart.Enabled:=True;
    BtStop.Enabled:=false;
    except
    Application.MessageBox('保存声音文件出错!','错误',MB_ICONERROR+MB_OK);
    BtStart.Enabled:=True;
    BtStop.Enabled:=false;
    end;
    end;
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    label1.Caption:=formatdatetime('hh:mm:ss',time-strtotime(str11));
    end;end.