ASP.NET下调用ffmpeg实现视频水印

yibin 2015-02-09 建站源码 526

视频加水印这块,我走了不少弯路,主要是相关资料太混乱,有人说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 处理后的视频
水印就加到这吧!有问题多多交流!

扫码添加微信

13013082126 扫描微信 建站咨询 优化咨询