C#實(shí)現(xiàn)為視頻添加水印
文章描述
以下主要還是使用到了ffmpeg命令,分別實(shí)現(xiàn)了給視頻添加圖片水印以及文字水印。

開發(fā)環(huán)境
.NET Framework版本:4.5
開發(fā)工具
Visual Studio 2013
實(shí)現(xiàn)代碼
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>
/// 按時(shí)間獲取某幀圖片
/// </summary>
/// <param name="videoPath">視頻路徑</param>
/// <param name="outPath">輸出路徑</param>
/// <param name="frameTime">時(shí)間(格式: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 = "請(qǐng)選擇視頻文件";
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;
}
}實(shí)現(xiàn)效果


代碼解析:著重介紹下添加文字水印的,由于很多時(shí)候我們需要添加的是中文,所以需要將字體包先放入到ffmepg的同級(jí)目錄,然后指定該字體。
到此這篇關(guān)于C#實(shí)現(xiàn)為視頻添加水印的文章就介紹到這了,更多相關(guān)C#視頻添加水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#中的定時(shí)器Timer類及其垃圾回收機(jī)制
這篇文章主要介紹了C#中的定時(shí)器Timer類及其垃圾回收機(jī)制,講解了Timer相關(guān)的單線程異步工作,需要的朋友可以參考下2016-04-04
分析C# Dictionary的實(shí)現(xiàn)原理
對(duì)于C#中的Dictionary類相信大家都不陌生,這是一個(gè)Collection(集合)類型,可以通過Key/Value(鍵值對(duì)的形式來存放數(shù)據(jù);該類最大的優(yōu)點(diǎn)就是它查找元素的時(shí)間復(fù)雜度接近O(1)。那么什么樣的設(shè)計(jì)能使得Dictionary類實(shí)現(xiàn)O(1)的時(shí)間復(fù)雜度呢2021-06-06
WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能
這篇文章主要介紹了WinForm使用DataGridView實(shí)現(xiàn)類似Excel表格的查找替換功能,現(xiàn)在小編通過本文給大家分享查找替換實(shí)現(xiàn)過程,需要的朋友可以參考下2021-07-07
C#五類運(yùn)算符使用表達(dá)式樹進(jìn)行操作
這篇文章介紹了C#五類運(yùn)算符使用表達(dá)式樹進(jìn)行操作,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01

