Delphi를 사용하여 녹음 프로그램을 만드는 방법
첸징타오
Delphi는 InPRise(이전 Borland)의 뛰어난 시각적 프로그래밍 도구입니다. 내장된 Mediaplayer 컨트롤은 멀티미디어 개발을 위한 강력한 도구입니다. 이를 사용하면 단 몇 분만에 Jieba와 같은 멀티미디어 파일을 재생할 수 있는 프로그램을 만들 수 있습니다. 하지만 이를 사용하여 녹음 프로그램을 만들 수도 있다는 사실을 아는 사람은 거의 없습니다.
Delphi를 실행하고 시스템 페이지의 Mediaplayer 컨트롤을 폼으로 드래그합니다. 기본 이름은 Mediaplayer1입니다. 우리 프로그램은 자체 버튼을 사용하므로 Mediaplayer1의 Visible 속성을 False로 설정하고 다른 속성을 기본값으로 유지합니다. Button1과 Button2라는 두 개의 버튼을 더 배치합니다. Button1의 속성 Name은 BtStart로 변경되고, Caption은 "Start Recording"으로 변경되고, Button2의 속성 Name은 BtStop으로 변경되고, Caption은 "Stop Recording"으로 변경되고, Enabled 속성은 False로 변경됩니다. 그런 다음 창을 코드 창으로 전환하고 코드 작성을 시작합니다.
프로그램에서는 Wav 파일의 파일 헤더 형식을 정의합니다. 녹음할 때 먼저 파일 헤더만으로 Wav 파일을 만든 다음 Mediaplayer1에서 녹음한 사운드를 파일에 씁니다. CreateWav 프로세스에서 여러 매개변수의 의미는 다음과 같습니다. 첫 번째 채널은 사운드 채널을 나타내고, 1을 취하면 모노를 나타내고, 2를 취하면 스테레오를 나타냅니다. 해상도 역시 2가지 값만 선택할 수 있으며, 8을 선택하면 8비트 사운드를 나타내고, 16비트를 선택하면 11025, 22050, 44100과 같은 사운드 주파수를 나타냅니다. 값이 클수록 소리가 선명해지며, 녹음되는 파일의 크기도 커지는 것은 물론입니다. 마지막 매개변수는 해당 파일 이름을 나타냅니다. 따라서 CreateWav는 다음과 같은 형식을 가질 수 있습니다.
CreateWav(1,8,11025,'C:/abc.wav');//C 드라이브의 루트 디렉터리에 빈도가 11025인 abc.wav라는 8비트 모노 Wav 파일을 생성합니다.
CreateWav(2,16,44100,'C:/abc.wav');//C 드라이브의 루트 디렉터리에 16비트 스테레오 채널 주파수 44100을 사용하여 abc.wav라는 Wav 파일을 생성합니다.
델파이로 제작된 해외 원격제어 소프트웨어로 잘 알려진 넷버스(Netbus)에는 사운드 모니터링 기능이 있는데, 이는 본 글의 방법으로 작성됐다. 먼저 상대방의 음성을 녹음한 후 다시 전송하여 상대방을 모니터링하는 목적을 달성합니다. 물론, 전제는 상대방이 마이크를 설치해야 한다는 것입니다. 그렇지 않으면 상대방이 재생하는 사운드가 모니터링됩니다(예를 들어 Jieba 또는 Readplay를 열고 이 프로그램을 실행하여 재생된 사운드를 녹음합니다).
실제로 현재의 네트워크 음향 전송 기술은 어느 정도 발전했고, 음성인터콤과 IP전화도 성숙해지기 시작했다. 그러나 VOX 형식이나 ACM 형식을 사용합니다. 특정 코드는 내 홈페이지(http://Lovejingtao.126.com)에서 다운로드할 수 있습니다. 그러나 VOX 또는 ACM 형식에 익숙하지 않은 경우 이 기사의 방법을 사용하여 자신만의 "녹음기"를 만들 수도 있습니다. 온라인 비디오 재생을 위한 시스템과 함께 제공되는 avifil32.dll을 호출하는 방법에 대해서는 기회가 되면 알려드리겠습니다.
이 프로그램은 Pwin98+Delphi5에서 통과되었습니다.
단위 Unit1;
인터페이스
용도
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자,
StdCtrls, MPlayer;
유형
TWavHeader = Record //Wav 파일 헤더 형식 정의
rId: longint;
rLen : longint;
wId: longint;
fId: longint;
fLen : longint;
wFormatTag : 단어;
n채널 : 단어;
nSamplesPerSec : longint;
nAvgBytesPerSec : longint;
nBlockAlign: 단어;
wBitsPerSample: 단어;
dId: longint;
wSampleLength : longint;
끝;
TForm1 = 클래스(TForm)
MediaPlayer1: TMediaPlayer;
BtStart: TButton;
BtStop: T버튼;
절차 CreateWav(채널 : 단어; 해상도 : 단어; 속도 : longint; fn : 문자열);//Wav 파일 헤더 작성 프로세스 사용자 정의
절차 BtStartClick(Sender: TObject);
절차 BtStopClick(Sender: TObject);
사적인
{비공개 선언}
공공의
{공개 선언}
끝;
var
Form1: TForm1;
구현
{$R *.DFM}
절차 TForm1.CreateWav( 채널 : 단어; { 1(모노) 또는 2(스테레오) }
해상도: 단어 {8 또는 16, 8비트 또는 16비트 사운드를 나타냄}
rate: longint; {소리 주파수, 예: 11025, 22050, 44100}
fn: string {해당 파일 이름});
var
wf: TWavHeader 파일;
wh : TWav헤더;
시작하다
wh.rId := $46464952;
wh.rLen := 36;
wh.wId := $45564157;
wh.fId := $20746d66;
wh.fLen := 16;
wh.wFormatTag := 1;
wh.nChannels := 채널;
wh.nSamplesPerSec := 속도;
wh.nAvgBytesPerSec := 채널*속도*(해상도 div 8);
wh.nBlockAlign := 채널*(해상도 div 8);
wh.wBitsPerSample := 해상도;
wh.dId := $61746164;
wh.wSampleLength := 0;
Assignfile(wf,fn); {해당 파일 열기}
rewrite(wf); {포인터를 파일의 시작 부분으로 이동}
write(wf,wh); {파일 헤더에 쓰기}
closefile(wf); {파일 닫기}
끝;
절차 TForm1.BtStartClick(Sender: TObject);
시작하다
노력하다
//프로그램의 현재 디렉토리에 Wav 파일 Temp.wav를 생성합니다.
CreateWav(1, 8, 11025, (ExtractFilePath(application.ExeName)+ 'Temp.wav'));
MediaPlayer1.DeviceType := dtAutoSelect;
MediaPlayer1.FileName := (ExtractFilePath(Application.ExeName)+ 'Temp.wav');
MediaPlayer1.Open;
MediaPlayer1.StartRecording;
BtStart.Enabled:=false;
BtStop.Enabled:=true;
제외하고
BtStart.Enabled:=참;
BtStop.Enabled:=false;
Application.MessageBox('미디어 장치 초기화에 실패했습니다!','오류',MB_ICONERROR+MB_OK);
끝;
끝;
절차 TForm1.BtStopClick(Sender: TObject);
시작하다
노력하다
MediaPlayer1.Stop;
MediaPlayer1.저장;
MediaPlayer1.Close;
Application.MessageBox('음성녹음 완료!','메시지',MB_ICONINFORMATION+MB_OK);
BtStart.Enabled:=참;
BtStop.Enabled:=false;
제외하고
Application.MessageBox('사운드 파일 저장 오류!','Error',MB_ICONERROR+MB_OK);
BtStart.Enabled:=참;
BtStop.Enabled:=false;
끝;
끝;
끝.
보충: 1. 녹음된 파일을 재생할 때 오디오 속성의 Wav 값을 높여야 할 수도 있습니다.
2. 시스템에 다른 오디오 드라이버가 설치되어 있는 경우 녹음되는 Wav 파일의 크기는 0일 수 있지만 확장자를 Wav로 변경하면 녹음되는 사운드 파일이 동시에 생성됩니다. 그러나 이런 일은 거의 발생하지 않습니다. (확률은 거의 제로^-^)
3. 이 프로그램은 Jieba 및 Replayer를 실행하는 동안 사운드 녹음을 전달할 수 있습니다.