大家好,对C# 文字视频生成器的实现方法感兴趣的小伙伴,下面一起跟随三零脚本的小编来看看C# 文字视频生成器的实现方法的例子吧。
利用录屏功能录制语句的生成过程,并保存成视频格式
这个软件主要是基于录屏功能来实现的,不过是一键式的罢了,当然实现录屏我们用了第三方的插件:AForge。项目需要的DLL如下图:
代码:
/**
*
* @arrange (三零.脚本) www.q3060.com
**/
public class RecordingUtil
{
VideoFileWriter vfWriter = new VideoFileWriter();
ScreenCaptureStream scStream = null;
readonly Rectangle Rect;
public RecordingUtil(Rectangle rect, int interval = 40)
{
Rect = rect;
scStream = new ScreenCaptureStream(rect, interval);
scStream.NewFrame += (s, e1) =>
{
vfWriter.WriteVideoFrame(e1.Frame);
};
}
public void Start(string savePath, int Rate = 4000 * 1024)
{
vfWriter.Open(savePath, Rect.Width, Rect.Height, 25, VideoCodec.MPEG4, 4000 * 1024);
scStream.Start();
}
public void Stop()
{
if (scStream != null && scStream.IsRunning)
{
scStream.Stop();
}
if (vfWriter.IsOpen)
{
vfWriter.Close();
}
}
}
代码2:
/**
*
* @arrange (三零.脚本) www.q3060.com
**/
private void btnCreate_Click(object sender, EventArgs e)
{
checkNull();
btnCreate.Text = "正在生成";
btnCreate.Enabled = false;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "视频文件|*.MP4";
if (sfd.ShowDialog() == DialogResult.OK)
{
Point point = new Point(this.Location.X + 5, this.Location.Y + 25);
Size size = new Size(splitContainer1.Panel1.Width % 2 == 1 ? splitContainer1.Panel1.Width - 1 : splitContainer1.Panel1.Width, splitContainer1.Panel1.Height % 2 == 1 ? splitContainer1.Panel1.Height - 1 : splitContainer1.Panel1.Height);
Rectangle rect = new Rectangle(point, size);
RecordingUtil Recording = new RecordingUtil(rect);
Recording.Start(sfd.FileName);
createText(txtWord.Text);
Recording.Stop();
}
btnCreate.Text = "生 成";
btnCreate.Enabled = true;
}
private void btnPreview_Click(object sender, EventArgs e)
{
checkNull();
btnPreview.Text = "正在预览";
btnPreview.Enabled = false;
createText(txtWord.Text);
btnPreview.Text = "预 览";
btnPreview.Enabled = true;
}
private void checkNull()
{
if (string.IsNullOrWhiteSpace(txtWord.Text))
{
toolTip1.Hide(txtWord);
toolTip1.Show("不可为空!", txtWord, 5, -60, 2000);
return;
}
}
private void createText(string text)
{
Graphics g = splitContainer1.Panel1.CreateGraphics();
g.Clear(splitContainer1.Panel1.BackColor);
Font font = new Font("华文行楷", 25);
// Brush whiteBrush = new SolidBrush(Color.FromArgb(0, 192, 0));
Brush whiteBrush = new SolidBrush(Color.Black);
int x = 0, y = 0;
string[] arr = txtWord.Text.Split('\n');
for (int i = 0; i < arr.Length; i++)
{
x = 40 * i + 15;
for (int j = 0; j < arr[i].Length; j++)
{
y = 40 * j + 15;
g.DrawString(arr[i][j].ToString(), font, whiteBrush, x, y);
Delay(300);
}
}
}
private void Delay(double mm)
{
DateTime now = DateTime.Now;
while (DateTime.Now.AddMilliseconds(-mm) <= now)
{
Application.DoEvents();
}
}
效果: