日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

操作 Wave 文件(14): waveOutSetPlaybackRate、waveOutSetPitch

發布時間:2024/9/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作 Wave 文件(14): waveOutSetPlaybackRate、waveOutSetPitch 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??


這兩個參數也都是可以 Get(waveOutGetPlaybackRate、waveOutGetPitch)

設備默認的播放速度是 $00010000, 此值乘以 2 是快一倍, 除以 2 是慢一倍; 最快可到 $000F8000.
設備默認的音高參數是 $00010000, 此值乘以 2 是高一倍, 除以 2 是低一倍; 最高可到 $000F8000.

可能有很多聲卡不支持, 我的 IBM 手提就不支持; 不過通過其他技術可以實現的.

代碼文件(僅有播放速度的設置代碼):

unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;TrackBar1: TTrackBar;Button5: TButton;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);procedure Button4Click(Sender: TObject);procedure Button5Click(Sender: TObject);procedure TrackBar1Change(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses MMSystem;function GetWaveFmtData(path: string; var fmt: TWaveFormatEx; var buf: TBytes): Boolean; varhFile: HMMIO;ckiRIFF,ckiFmt,ckiData: TMMCKInfo; beginResult := False;hFile := mmioOpen(PChar(path), nil, MMIO_READ);if hFile = 0 then Exit;ZeroMemory(@ckiRIFF, SizeOf(TMMCKInfo));ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));ZeroMemory(@ckiData, SizeOf(TMMCKInfo));ckiRIFF.fccType := mmioStringToFOURCC('WAVE', 0);ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);ckiData.ckid := mmioStringToFOURCC('data', 0);ZeroMemory(@fmt, SizeOf(TWaveFormatEx));mmioDescend(hFile, @ckiRIFF, nil, MMIO_FINDRIFF);if (ckiRIFF.ckid = FOURCC_RIFF) and (ckiRIFF.fccType = mmioStringToFOURCC('WAVE',0)) and(mmioDescend(hFile, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) and(mmioRead(hFile, @fmt, ckiFmt.cksize) = ckiFmt.cksize) and(mmioAscend(hFile, @ckiFmt, 0) = MMSYSERR_NOERROR) and(mmioDescend(hFile, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) thenbeginSetLength(buf, ckiData.cksize);Result := (mmioRead(hFile, PAnsiChar(buf), ckiData.cksize) = ckiData.cksize);end;mmioClose(hFile, 0); end;//------------------------------------------------------------------------------ varwh: TWaveHdr;hWaveOut: HWAVE;fmt: TWaveFormatEx;buf: TBytes;procedure TForm1.FormCreate(Sender: TObject); beginButton1.Caption := '打開并播放';Button2.Caption := '暫停';Button3.Caption := '繼續';TrackBar1.Min := -4;TrackBar1.Max := 4;TrackBar1.Position := 0; end;procedure WaveProc(hWave: HWAVE; uMsg, dwInstance, dwParam1, dwParam2: DWORD); stdcall; begincase uMsg ofMM_WOM_DONE: waveOutUnprepareHeader(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr));end; end;procedure TForm1.Button1Click(Sender: TObject); constpath = 'C:\WINDOWS\Media\Windows XP 啟動.wav'; varvolume: DWORD; beginGetWaveFmtData(path, fmt, buf);wh.lpData := PAnsiChar(buf);wh.dwBufferLength := Length(buf);wh.dwBytesRecorded := 0;wh.dwUser := 0;wh.dwFlags := WHDR_BEGINLOOP or WHDR_ENDLOOP;wh.dwLoops := 3;wh.lpNext := nil;wh.reserved := 0;waveOutOpen(@hWaveOut, WAVE_MAPPER, @fmt, DWORD(@WaveProc), 0, CALLBACK_FUNCTION);waveOutPrepareHeader(hWaveOut, @wh, SizeOf(TWaveHdr));waveOutWrite(hWaveOut, @wh, SizeOf(TWaveHdr)); end;//暫停 procedure TForm1.Button2Click(Sender: TObject); beginwaveOutPause(hWaveOut); end;//繼續 procedure TForm1.Button3Click(Sender: TObject); beginwaveOutRestart(hWaveOut); end;//調整播放速度 procedure TForm1.TrackBar1Change(Sender: TObject); constmid = $00010000; varpos, rate: Integer; beginpos := TTrackBar(Sender).Position;if pos > 0 thenrate := mid shl poselserate := mid shr Abs(pos);waveOutSetPlaybackRate(hWaveOut, rate);Text := IntToStr(pos); end;//判斷設備是否支持播放速度調整 procedure TForm1.Button4Click(Sender: TObject); varwaveOutCaps: TWaveOutCaps; beginwaveOutGetDevCaps(WAVE_MAPPER, @waveOutCaps, SizeOf(TWaveOutCaps));if waveOutCaps.dwSupport and WAVECAPS_PLAYBACKRATE = WAVECAPS_PLAYBACKRATE thenShowMessage('默認設備支持播放速度調整.')elseShowMessage('默認設備不支持播放速度調整!'); end;//判斷設備是否支持聲調變化 procedure TForm1.Button5Click(Sender: TObject); varwaveOutCaps: TWaveOutCaps; beginwaveOutGetDevCaps(WAVE_MAPPER, @waveOutCaps, SizeOf(TWaveOutCaps));if waveOutCaps.dwSupport and WAVECAPS_PITCH = WAVECAPS_PITCH thenShowMessage('默認設備支持聲調變化.')elseShowMessage('默認設備不支持聲調變化!'); end;procedure TForm1.FormDestroy(Sender: TObject); beginif hWaveOut <> 0 then waveOutClose(hWaveOut); end;end.
窗體文件:

object Form1: TForm1Left = 0Top = 0Caption = 'Form1'ClientHeight = 204ClientWidth = 342Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalseOnCreate = FormCreateOnDestroy = FormDestroyPixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 32Top = 24Width = 75Height = 25Caption = #25171#24320#24182#25773#25918TabOrder = 0OnClick = Button1Clickendobject Button2: TButtonLeft = 136Top = 24Width = 75Height = 25Caption = #26242#20572TabOrder = 1OnClick = Button2Clickendobject Button3: TButtonLeft = 240Top = 24Width = 75Height = 25Caption = #32487#32493TabOrder = 2OnClick = Button3Clickendobject TrackBar1: TTrackBarLeft = 32Top = 88Width = 283Height = 45TabOrder = 3OnChange = TrackBar1Changeendobject Button4: TButtonLeft = 152Top = 139Width = 163Height = 25Caption = #21028#26029#35774#22791#26159#21542#25903#25345#36895#24230#35843#25972TabOrder = 4OnClick = Button4Clickendobject Button5: TButtonLeft = 152Top = 170Width = 163Height = 25Caption = #21028#26029#35774#22791#26159#21542#25903#25345#22768#35843#21464#21270TabOrder = 5OnClick = Button5Clickend end

轉載于:https://my.oschina.net/hermer/blog/320885

總結

以上是生活随笔為你收集整理的操作 Wave 文件(14): waveOutSetPlaybackRate、waveOutSetPitch的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。