C#实现为视频添加水印

 

文章描述

以下主要还是使用到了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#视频添加水印内容请搜索编程宝库以前的文章,希望以后支持编程宝库

在项目开发的过程中,不可避免的遇到这种情况:主程序由于算法的第三方库使用的目标平台需为X86的,但是在调用别家公司的程序或者是其他程序驱动不能为X86的(使用x64或者Any cup的没问题)。我遇 ...