zoukankan      html  css  js  c++  java
  • C# ffmpeg 视频处理格式转换和添加水印

    通过C#调用ffmpeg 将flv格式转换为mp4格式,并添加水印

    C#调用ffmpeg的方法封装如下:


    /// <summary>
    /// 视频处理器ffmpeg.exe的位置
    /// </summary>
    public string FFmpegPath { get; set; }

    /// <summary>
    /// 调用ffmpeg.exe 执行命令
    /// </summary>
    /// <param name="Parameters">命令参数</param>
    /// <returns>返回执行结果</returns>
    private string RunProcess(string Parameters)
    {
    //创建一个ProcessStartInfo对象 并设置相关属性
    var oInfo = new ProcessStartInfo(FFmpegPath, Parameters);
    oInfo.UseShellExecute = false;
    oInfo.CreateNoWindow = true;
    oInfo.RedirectStandardOutput = true;
    oInfo.RedirectStandardError = true;
    oInfo.RedirectStandardInput = true;

    //创建一个字符串和StreamReader 用来获取处理结果
    string output = null;
    StreamReader srOutput = null;

    try
    {
    //调用ffmpeg开始处理命令
    var proc = Process.Start(oInfo);

    proc.WaitForExit();


    //获取输出流
    srOutput = proc.StandardError;

    //转换成string
    output = srOutput.ReadToEnd();

    //关闭处理程序
    proc.Close();
    }
    catch (Exception)
    {
    output = string.Empty;
    }
    finally
    {
    //释放资源
    if (srOutput != null)
    {
    srOutput.Close();
    srOutput.Dispose();
    }
    }
    return output;
    }


    转换格式的命令参数:-i orignal.flv -y -b 1024k -acodec copy -f mp4 newFile.mp4

    添加水印的命令参数:-i orignal.flv -i water.png -filter_complex "overlay=10:10" newFile.flv

    参数简要说明和细节提示

    orignal.flv : 要处理的原始视频文件(最好是绝对路径)
    -y : 覆盖已有文件(注意,加水印不可覆盖原始文件,否则只能生成1秒的视频)
    -b:视频的码率 这里设置1024k 基本可满足无损处理 如不设置-b参数则默认为200k 视频会非常模糊
    -acodec copy : 保持音频质量不变
    -f mp4 : 表示转换的视频格式
     
    -i water.png : 水印图片路径
    overlay=10:10 : 水印距离视频的左上角坐标
    其他位置参数:
    右上角:main_w-overlay_w-10:10
    左下角:10:main_h-overlay_h-10
    右下角:main_w-overlay_w-10:main_h-overlay_h-10
     
    newFile.mp4  要保存的文件路径

    笔者尝试了各种命令的组合,发现对于不同版本的ffmpeg,有的参数是不能使用的,就笔者使用的2.8.2版本最终 找了一个比较好的解决方案:

    可以选择使用以下命令参数:

    //同时转换格式和加水印

    -i orignal.flv -i water.png -filter_complex "overlay=10:10" -y -b 1024k -acodec copy -f mp4

     //只加水印,不做格式转换

    -i orignal.flv -i water.png -filter_complex "overlay=10:10" -b 1024k -acodec copy

    总结:                                                          
    C#调用ffmpeg时 不要使用proc.WaitForExit();方法,否则会假死

    ffmpeg的版本最好使用最新版本,并参考命令参数说明

    无损转换,无损加水印 要注意保证视频的码率 和音频的参数(直接copy,视频不能这样写-avcodec copy  会报错,只能用-b设置视频码率) 

    原文链接:https://blog.csdn.net/zhongjie112/article/details/50448327

  • 相关阅读:
    Linux下编译安装redis
    docker搭建swoole的简易的聊天室
    Linux下面安装swoole
    laravel命令
    史上最污技术解读,60 个 IT 术语我竟然秒懂了.....
    redis集群搭建
    Windows安装MongoDB
    十大经典排序算法(动图演示)
    消息中间件基础
    laravel邮件发送
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/11601817.html
Copyright © 2011-2022 走看看