unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Process, Unix;
type
{ TForm1 }
TForm1 = class(TForm)
btnStart: TButton;
btnStop: TButton;
Memo1: TMemo;
SaveDialog1: TSaveDialog;
procedure btnStartClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FRecording: Boolean;
FFmpegProcess: TProcess;
public
procedure StartRecording(const FileName: string);
procedure StopRecording;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
btnStop.Enabled := False;
FRecording := False;
end;
procedure TForm1.btnStartClick(Sender: TObject);
var
VideoDevice, AudioDevice: string;
begin
if SaveDialog1.Execute then
begin
VideoDevice := '/dev/video0';
AudioDevice := 'hw:0';
if not FileExists(VideoDevice) then
begin
ShowMessage('视频设备不存在: ' + VideoDevice);
Exit;
end;
StartRecording(SaveDialog1.FileName);
btnStart.Enabled := False;
btnStop.Enabled := True;
FRecording := True;
end;
end;
procedure TForm1.btnStopClick(Sender: TObject);
begin
StopRecording;
end;
procedure TForm1.StartRecording(const FileName: string);
var
FfmpegCmd: string;
begin
FFmpegProcess := TProcess.Create(nil);
FFmpegProcess.Executable := 'ffmpeg';
FFmpegProcess.Parameters.Add('-y');
FFmpegProcess.Parameters.Add('-f');
FFmpegProcess.Parameters.Add('v4l2');
FFmpegProcess.Parameters.Add('-input_format');
FFmpegProcess.Parameters.Add('yuyv422');
// FFmpegProcess.Parameters.Add('mjpeg');
FFmpegProcess.Parameters.Add('-i');
FFmpegProcess.Parameters.Add('/dev/video0'); // 视频输入设备
// 添加音频输入(ALSA)
FFmpegProcess.Parameters.Add('-f');
FFmpegProcess.Parameters.Add('alsa');
FFmpegProcess.Parameters.Add('-i');
FFmpegProcess.Parameters.Add('hw:0'); // 音频输入设备
// 设置编码参数
FFmpegProcess.Parameters.Add('-c:v');
FFmpegProcess.Parameters.Add('libx264');
FFmpegProcess.Parameters.Add('-preset');
FFmpegProcess.Parameters.Add('fast');
FFmpegProcess.Parameters.Add('-c:a');
FFmpegProcess.Parameters.Add('aac');
// 输出文件
FFmpegProcess.Parameters.Add(FileName); //.mp4
FFmpegProcess.Options := [poUsePipes, poNoConsole];
FFmpegProcess.Execute;
end;
procedure TForm1.StopRecording;
begin
if FRecording and Assigned(FFmpegProcess) then
begin
try
FFmpegProcess.Terminate(0);
// FFmpegProcess.Write('q' + LineEnding, 1 + Length(LineEnding));
FFmpegProcess.WaitOnExit;
if FFmpegProcess.ExitStatus = 0 then
ShowMessage('录制成功!')
else
ShowMessage('录制失败:' + IntToStr(FFmpegProcess.ExitStatus));
except
on E: Exception do
begin
ShowMessage('停止录制时出错: ' + E.Message);
end;
end;
FreeAndNil(FFmpegProcess);
btnStart.Enabled := True;
btnStop.Enabled := False;
FRecording := False;
end;
end;
end.