ASP.NET下调用ffmpeg实现视频水印
视频加水印这块,我走了不少弯路,主要是相关资料太混乱,有人说ffmpeg+avisynth可以,但我不想装avisynth,最后看了老外一篇文章终于OK了,我在这提醒一下:vhook这个参数早就不用了,新版的不是-vfilters,而是-vf,我这用的ffmpeg版本是FFmpeg version: 2013-03-22 git-e0e8c20,它的水印参数是:
Top left corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:10 [out]" outputvideo.flv
Top right corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:10 [out]" outputvideo.flv
Bottom left corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:main_h-overlay_h-10 [out]" outputvideo.flv
Bottom right corner
ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]" outputvideo.flv
ASP.NET下使用:
[csharp]
//添加水印,fileName视频地址,imgFile水印图片地址,outputFile输出地址
public int WaterMark(string fileName, string imgFile, string outputFile)
{
//取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\aspx1\ffmpeg.exe" />
string ffmpeg = Server.MapPath(PublicMethod.ffmpegbin);
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
{
return 0;
}
//建立ffmpeg进程
System.Diagnostics.ProcessStartInfo WaterMarkstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
//后台运行
WaterMarkstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//运行参数
string config=" -i " + fileName + " -vf \"movie=" + imgFile + " [watermark]; [in][watermark] overlay=0:0 [out]\" " + outputFile;
WaterMarkstartInfo.Arguments = config;
try
{
//开始加水印
System.Diagnostics.Process.Start(WaterMarkstartInfo);
}
catch
{
return 0;
}
return 1;
}
//添加水印,fileName视频地址,imgFile水印图片地址,outputFile输出地址
public int WaterMark(string fileName, string imgFile, string outputFile)
{
//取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\aspx1\ffmpeg.exe" />
string ffmpeg = Server.MapPath(PublicMethod.ffmpegbin);
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
{
return 0;
}
//建立ffmpeg进程
System.Diagnostics.ProcessStartInfo WaterMarkstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
//后台运行
WaterMarkstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//运行参数
string config=" -i " + fileName + " -vf \"movie=" + imgFile + " [watermark]; [in][watermark] overlay=0:0 [out]\" " + outputFile;
WaterMarkstartInfo.Arguments = config;
try
{
//开始加水印
System.Diagnostics.Process.Start(WaterMarkstartInfo);
}
catch
{
return 0;
}
return 1;
}
是不是很简单呢,可是程序调试运行起来的时候,你会发现ffmpeg根本找不着你水印的图片:
经过我个人反复调试问题锁定在:-vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:10 [out]"中的movie=后面只接受相对路径,如/data/watermarklogo.png之类的,一旦使用C:/data/watermarklogo.png它就找不着北了,如果是窗体程序的话,把watermarklogo.png搁到程序所在的目录下使用相对路径就OK了,但是如果是Web怎么办呢?相信大家可能就想到了,设置WorkingDirectory,没错,假如图片在C:/data/watermarklogo.png,那么咱们就这样写:
[csharp]
WaterMarkstartInfo.WorkingDirectory = "C:\\data\\";
WaterMarkstartInfo.WorkingDirectory = "C:\\data\\";
试试,是不是可以了呢?折腾了老多天的问题,终于解决了。
可是回头我们就会发现加完水印后,视频质量严重下降,这是怎回事,其实上面的命令只是简单的水印命令,如果想保证视频质量的话,命令应该如下:
ffmpeg.exe -y -i input.avi -acodec copy -b 300k -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=0:0 [out]" output.avi
-y 表示有同名的output.flv存在时不提示,直接覆盖
-i input.avi 表示要进行水印添加处理的视频
-acodec copy 表示保持音频不变
-b 300k 表示处理视频的比特率,用-vcodec copy时报错,可以使用其他工具获取到原始视频比特率后加到这里,保持比特率基本不变,不然默认为200k,视频有损。
-vf "..." 中间便是水印处理参数,主要是overlay,第一个参数表示水印距离视频左边的距离,第二个参数表示水印距离视频上边的距离
output.avi 处理后的视频
水印就加到这吧!有问题多多交流!
补充:Web开发 , ASP.Net ,