You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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的对象(比如ImageGraphicsFont)一定要用using语句包裹,确保使用后自动释放资源,避免长时间运行导致内存溢出。
  • 文字可读性:如果视频画面复杂,建议给文字添加阴影、描边,或者使用高对比度的颜色,保证文字在所有帧上都清晰可见。
  • 动态文字:如果需要逐帧变化的内容(比如时间戳、自定义字幕),只需要在循环内根据i(帧索引)动态生成text字符串即可。
  • 性能优化:字体、画刷这类对象不要在循环内重复创建,放在循环外的using块里可以减少对象创建销毁的开销。

内容的提问来源于stack exchange,提问作者Frederik Hansen

火山引擎 最新活动