日期:2014-05-16  浏览次数:21040 次

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下使用:

    //添加水印,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,那么咱们就这样写:

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 处理后的视频

水印就加到这吧!有问题多多交流!