C#实现为视频添加水印

 更新时间:2023年01月09日 14:19:46   作者:Csharp小记  
这篇文章主要为大家详细介绍了C#如何使用ffmpeg命令,分别实现给视频添加图片水印以及文字水印,文中的示例代讲解详细,感兴趣的可以了解一下

文章描述

以下主要还是使用到了ffmpeg命令,分别实现了给视频添加图片水印以及文字水印。

开发环境

.NET Framework版本:4.5

开发工具

Visual Studio 2013

实现代码

 public static void Run(string cmd)
        {
            try
            {
                string ffmpeg = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg.exe";
                ProcessStartInfo startInfo = new ProcessStartInfo(ffmpeg);
                startInfo.UseShellExecute = false;
                startInfo.CreateNoWindow = true;
                startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                startInfo.Arguments = cmd;
                Process process = Process.Start(startInfo);
                process.WaitForExit(3000);
                process.Kill();
            }
            catch { }
        }
 /// <summary>
        /// 按时间获取某帧图片
        /// </summary>
        /// <param name="videoPath">视频路径</param>
        /// <param name="outPath">输出路径</param>
        /// <param name="frameTime">时间(格式:00:00:01)</param>
        public static void GetFrame(string videoPath, string outPath, string frameTime)
        {
            Run(string.Format("-ss 00:00:01 -i {1} {2}", frameTime, videoPath, outPath));
        }

        /// <summary>
        /// 批量添加图片水印
        /// </summary>
        /// <param name="videoPath"></param>
        /// <param name="outPath"></param>
        /// <param name="listImg"></param>
        public static void AddImageMark(string videoPath, string outPath, List<ImgMark> listImg)
        {
            string imgs = "", postions = "";
            foreach (ImgMark mark in listImg)
            {
                imgs += " -i " + mark.ImgPath;
                postions += "overlay=" + mark.Postion.X + ":" + mark.Postion.Y+",";
            }
            postions = postions.Remove(postions.Length - 1);
            Run(string.Format("-i {0}{1} -filter_complex \"{2}\" {3}", videoPath, imgs, postions, outPath));
        }

        /// <summary>
        /// 添加文字水印
        /// </summary>
        /// <param name="videoPath">视频路径</param>
        /// <param name="outPath">输出路径</param>
        /// <param name="textMark">水印属性</param>
        public static void AddTextMark(string videoPath, string outPath, TextMark textMark)
        {
            Run(string.Format(" -i {0}  -vf \"drawtext=fontfile={1}: text='{2}':x={3}:y={4}:fontsize={5}:fontcolor={6}\" {7}", videoPath, textMark.FontFile, textMark.Text, textMark.X, textMark.Y, textMark.FontSize, textMark.FontColor.Name.ToLower(), outPath));
            //@"%{localtime\:%Y\-%m\-%d %H-%M-%S}"
        }
 private void btn_select_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "视频|*.mp4;*.avi";
            ofd.Title = "请选择视频文件";
            ofd.InitialDirectory = Application.StartupPath;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                axWindowsMediaPlayer1.URL = ofd.FileName;
            }
        }

        private void btn_text_Click(object sender, EventArgs e)
        {
            if (!File.Exists(axWindowsMediaPlayer1.URL))
            {
                MessageBox.Show("未选择视频");
                return;
            }
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "视频|*.mp4";
            sfd.AddExtension = true;
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                TextMark mark = new TextMark
                {
                    Text = "这里是水印",
                    FontColor = Color.Red,
                    FontFile = "simsun.ttc",
                    FontSize = 100,
                    X = 80,
                    Y = 60
                };
                FFmpegUtil.AddTextMark(axWindowsMediaPlayer1.URL, sfd.FileName, mark);
                axWindowsMediaPlayer2.URL = sfd.FileName;
            }
        }

        private void btn_img_Click(object sender, EventArgs e)
        {
            if (!File.Exists(axWindowsMediaPlayer1.URL))
            {
                MessageBox.Show("未选择视频");
                return;
            }
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "视频|*.mp4";
            sfd.AddExtension = true;
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                FFmpegUtil.AddImageMark(axWindowsMediaPlayer1.URL, sfd.FileName, new List<ImgMark>{
                    new ImgMark {
                    ImgPath=@"C:\Users\Zero\Desktop\a\\1.png",                   Postion=new Point(60,60)},
                    new ImgMark {ImgPath=@"C:\Users\Zero\Desktop\a\\1.png",             Postion=new Point(60,200)}});
                axWindowsMediaPlayer2.URL = sfd.FileName;
            }
        }

实现效果

代码解析:着重介绍下添加文字水印的,由于很多时候我们需要添加的是中文,所以需要将字体包先放入到ffmepg的同级目录,然后指定该字体。

到此这篇关于C#实现为视频添加水印的文章就介绍到这了,更多相关C#视频添加水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# DatagridView常用操作汇总

    C# DatagridView常用操作汇总

    这篇文章主要介绍了C# DatagridView常用操作汇总,罗列了一些常用的用法与技巧,需要的朋友可以参考下
    2014-07-07
  • 详解C#中的定时器Timer类及其垃圾回收机制

    详解C#中的定时器Timer类及其垃圾回收机制

    这篇文章主要介绍了C#中的定时器Timer类及其垃圾回收机制,讲解了Timer相关的单线程异步工作,需要的朋友可以参考下
    2016-04-04
  • 分析C# Dictionary的实现原理

    分析C# Dictionary的实现原理

    对于C#中的Dictionary类相信大家都不陌生,这是一个Collection(集合)类型,可以通过Key/Value(键值对的形式来存放数据;该类最大的优点就是它查找元素的时间复杂度接近O(1)。那么什么样的设计能使得Dictionary类实现O(1)的时间复杂度呢
    2021-06-06
  • C#中的Linq to Xml详解

    C#中的Linq to Xml详解

    这篇文章主要介绍了C#中的Linq to Xml详解,本文给出转换步骤以及大量实例,讲解了生成xml、查询并修改xml、监听xml事件、处理xml流等内容,需要的朋友可以参考下
    2015-01-01
  • WinForm使用DataGridView实现类似Excel表格的查找替换功能

    WinForm使用DataGridView实现类似Excel表格的查找替换功能

    这篇文章主要介绍了WinForm使用DataGridView实现类似Excel表格的查找替换功能,现在小编通过本文给大家分享查找替换实现过程,需要的朋友可以参考下
    2021-07-07
  • C#使用Log4.net记录日志文件

    C#使用Log4.net记录日志文件

    这篇文章介绍了C#使用Log4.net记录日志文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#五类运算符使用表达式树进行操作

    C#五类运算符使用表达式树进行操作

    这篇文章介绍了C#五类运算符使用表达式树进行操作,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#异常处理的技巧和方法

    C#异常处理的技巧和方法

    在本篇文章里小编给大家整理了关于C#异常处理的技巧和方法以及相关知识点,需要的朋友们学习下。
    2019-03-03
  • C#调用WebService的方法步骤

    C#调用WebService的方法步骤

    在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中如何调用WebService,感兴趣的小伙伴跟着小编一起来看看吧
    2025-03-03
  • c#打包文件解压缩的实例

    c#打包文件解压缩的实例

    下面小编就为大家分享一篇c#打包文件解压缩的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论