如何使用Accord框架为视频添加文字?附现有代码片段
用Accord.NET框架给视频添加文字的完整实现
嘿,我来帮你完成这个视频加文字的实现!基于你现有的代码框架,接下来只需要补充文字绘制的逻辑,同时要注意资源的正确释放(避免内存泄漏)。下面是具体的实现步骤和完整代码:
核心实现思路
- 先定义文字的样式(字体、大小、颜色等)
- 在每一帧的图像上用
Graphics.DrawString()绘制文字 - 严格管理所有可释放资源,避免内存溢出
- 最后将处理后的帧写入新视频文件
完整代码示例
using Accord.Video.FFMPEG; using System.Drawing; using System.Drawing.Drawing2D; // 基于你的现有代码补充完整 using (var vFReader = new VideoFileReader()) { vFReader.Open(@"\video.mp4"); // 定义文字样式:建议把这些对象放在循环外,减少重复创建开销 using (var font = new Font("微软雅黑", 28, FontStyle.Bold)) using (var textBrush = new SolidBrush(Color.White)) using (var shadowBrush = new SolidBrush(Color.FromArgb(180, 0, 0, 0))) // 半透明阴影提升可读性 using (var vFWriter = new VideoFileWriter()) { vFWriter.Open(@"\video2.mp4", vFReader.Width, vFReader.Height, vFReader.FrameRate, VideoCodec.MPEG4, vFReader.BitRate); for (var i = 0; i < vFReader.FrameCount; i++) { // 读取单帧图像,用using自动释放 using (var image = vFReader.ReadVideoFrame()) using (var graphics = Graphics.FromImage(image)) { // 优化绘图质量,让文字更平滑 graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; // 自定义文字内容:可以是固定文本,也可以是动态内容(比如帧序号、时间戳) var text = $"这是第 {i+1} 帧"; // 计算文字位置:比如右下角,留出20px边距 var textSize = graphics.MeasureString(text, font); var posX = image.Width - textSize.Width - 20; var posY = image.Height - textSize.Height - 20; // 先画阴影(偏移2px),再画主文字,提升文字辨识度 graphics.DrawString(text, font, shadowBrush, posX + 2, posY + 2); graphics.DrawString(text, font, textBrush, posX, posY); // 将处理后的帧写入新视频 vFWriter.WriteVideoFrame(image); } } vFWriter.Close(); } vFReader.Close(); }
关键注意事项
- 资源释放:所有实现
IDisposable的对象(比如Image、Graphics、Font)一定要用using语句包裹,确保使用后自动释放资源,避免长时间运行导致内存溢出。 - 文字可读性:如果视频画面复杂,建议给文字添加阴影、描边,或者使用高对比度的颜色,保证文字在所有帧上都清晰可见。
- 动态文字:如果需要逐帧变化的内容(比如时间戳、自定义字幕),只需要在循环内根据
i(帧索引)动态生成text字符串即可。 - 性能优化:字体、画刷这类对象不要在循环内重复创建,放在循环外的
using块里可以减少对象创建销毁的开销。
内容的提问来源于stack exchange,提问作者Frederik Hansen




