当前位置: 首页 > 编程笔记 >

C#实现通过ffmpeg从flv视频文件中截图的方法

柳奇思
2023-03-14
本文向大家介绍C#实现通过ffmpeg从flv视频文件中截图的方法,包括了C#实现通过ffmpeg从flv视频文件中截图的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C#实现通过ffmpeg从flv视频文件中截图的方法。分享给大家供大家参考。具体分析如下:

需要先下载ffmpeg,这是开源的,代码如下所示:

using System;

using System.Configuration;

public class PublicMethod:System.Web.UI.Page

{

    public PublicMethod()

    {

    }

    //文件路径

    public static string ffmpegtool = "ffmpeg/ffmpeg.exe";         

    public static string mencodertool = "mencoder/mencoder.exe";

    public static string flvtool = "flvtool/flvtool2.exe";//flv标记工具

    public static string upFile = "UpFiles" + "/";//上传文件夹

    public static string imgFile = "ImgFile" + "/";//图片文件夹

    public static string playFile = "PlayFiles" + "/";//flv文件夹

    public static string xmlFile = "xmlFiles" + "/";//xml文件夹

    public static string sizeOfImg = "240x180";//图片的宽与高

    public static string widthOfFile = "400";//flv文件的宽度

    public static string heightOfFile = "350";//flv文件的高度

    //public static string ffmpegtool = ConfigurationManager.AppSettings["ffmpeg"];

    //public static string mencodertool = ConfigurationManager.AppSettings["mencoder"];

    //public static string upFile = ConfigurationManager.AppSettings["upfile"] + "/";

    //public static string imgFile = ConfigurationManager.AppSettings["imgfile"] + "/";

    //public static string playFile = ConfigurationManager.AppSettings["playfile"] + "/";

    //文件图片大小

    //public static string sizeOfImg = ConfigurationManager.AppSettings["CatchFlvImgSize"];

    //文件大小

    //public static string widthOfFile = ConfigurationManager.AppSettings["widthSize"];

    //public static string heightOfFile = ConfigurationManager.AppSettings["heightSize"];

    //   // //获取文件的名字

    private System.Timers.Timer myTimer = new System.Timers.Timer(3000);//记时器

    public static string flvName = "";

    public static string imgName = "";

    public static string flvXml = "";

    public static int pId = 0;

    public static string GetFileName(string fileName)

    {

        int i = fileName.LastIndexOf("\") + 1;

        string Name = fileName.Substring(i);

        return Name;

    }

    //获取文件扩展名

    public static string GetExtension(string fileName)

    {

        int i = fileName.LastIndexOf(".")+1;

        string Name = fileName.Substring(i);

        return Name;

    }

    //

    #region //运行FFMpeg的视频解码,(这里是绝对路径)

    /// <summary>

    /// 转换文件并保存在指定文件夹下面(这里是绝对路径)

    /// </summary>

    /// <param name="fileName">上传视频文件的路径(原文件)</param>

    /// <param name="playFile">转换后的文件的路径(网络播放文件)</param>

    /// <param name="imgFile">从视频文件中抓取的图片路径</param>

    /// <returns>成功:返回图片虚拟地址;   失败:返回空字符串</returns>

    public void ChangeFilePhy(string fileName, string playFile, string imgFile)

    {

        //取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add   key="ffmpeg"   value="E:aspx1ffmpeg.exe"   />  

        string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);

        if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))

        {

            return;

        }

        //获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg  

        string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");

        //截图的尺寸大小,配置在Web.Config中,如:<add   key="CatchFlvImgSize"   value="240x180"   />  

        string FlvImgSize = PublicMethod.sizeOfImg;

        System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);

        FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

        FilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;

        //ImgstartInfo.Arguments = "   -i   " + fileName + "   -y   -f   image2   -t   0.05   -s   " + FlvImgSize + "   " + flv_img;

        try

        {

            //转换

            System.Diagnostics.Process.Start(FilestartInfo);

            //截图

            CatchImg(fileName, imgFile);

            //System.Diagnostics.Process.Start(ImgstartInfo);

        }

        catch

        {

        }

    }

    #endregion

    #region 截图

    public string CatchImg(string fileName,string imgFile)

    {

        //

        string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);

        //

        string flv_img =imgFile+".jpg";

        //

        string FlvImgSize = PublicMethod.sizeOfImg;

        //

        System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);

        ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

        //

        ImgstartInfo.Arguments = "   -i   " + fileName + "  -y  -f  image2   -ss 2 -vframes 1  -s   " + FlvImgSize + "   " + flv_img;

        try

        {

            System.Diagnostics.Process.Start(ImgstartInfo);

        }

        catch

        {

            return "";

        }

        //

        catchFlvTool(fileName);

        if (System.IO.File.Exists(flv_img))

        {

            return flv_img;

        }

        return "";

    }

    #endregion

    #region //运行FFMpeg的视频解码,(这里是(虚拟)相对路径)

    /// <summary>

    /// 转换文件并保存在指定文件夹下面(这里是相对路径)

    /// </summary>

    /// <param name="fileName">上传视频文件的路径(原文件)</param>

    /// <param name="playFile">转换后的文件的路径(网络播放文件)</param>

    /// <param name="imgFile">从视频文件中抓取的图片路径</param>

    /// <returns>成功:返回图片虚拟地址;   失败:返回空字符串</returns>

    public void ChangeFileVir(string fileName, string playFile, string imgFile)

    {

        //取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add   key="ffmpeg"   value="E:\aspx1\ffmpeg.exe"   />  

        string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);

        if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))

        {

            return;

        }

        //获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg  

        string flv_img = System.IO.Path.ChangeExtension(Server.MapPath(imgFile), ".jpg");

        string flv_file = System.IO.Path.ChangeExtension(Server.MapPath(playFile), ".flv");

        //截图的尺寸大小,配置在Web.Config中,如:<add   key="CatchFlvImgSize"   value="240x180"   />  

        string FlvImgSize = PublicMethod.sizeOfImg;

        System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);

        FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

        //此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg   0.4.9调试通过

        //ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv

        FilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;

        try

        {

            System.Diagnostics.Process ps = new System.Diagnostics.Process();

            ps.StartInfo = FilestartInfo;

            ps.Start();

            Session.Add("ProcessID", ps.Id);

            Session.Add("flv", flv_file);

            Session.Add("img", imgFile);

            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Test);

            myTimer.Enabled = true;

        }

        catch

        {

        }

    }

    #endregion

    #region //运行mencoder的视频解码器转换(这里是(绝对路径))

    public void MChangeFilePhy(string vFileName, string playFile, string imgFile)

    {

        string tool = Server.MapPath(PublicMethod.mencodertool);

        //string mplaytool = Server.MapPath(PublicMethod.ffmpegtool);

        if ((!System.IO.File.Exists(tool)) || (!System.IO.File.Exists(vFileName)))

        {

            return;

        }

        string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");

        //截图的尺寸大小,配置在Web.Config中,如:<add   key="CatchFlvImgSize"   value="240x180"   />  

        string FlvImgSize = PublicMethod.sizeOfImg;

        System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(tool);

        FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

        FilestartInfo.Arguments = " " + vFileName + " -o " + flv_file + " -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=1:dia=-1:cmp=0:vb_strategy=1 -vf scale=" + widthOfFile + ":" +heightOfFile + " -ofps 12 -srate 22050";

        try

        {

            System.Diagnostics.Process ps = new System.Diagnostics.Process();

            ps.StartInfo = FilestartInfo;

            ps.Start();

            Session.Add("ProcessID", ps.Id);

            Session.Add("flv", flv_file);

            Session.Add("img", imgFile);

            //pId = ps.Id;

            //flvName = flv_file;

            //imgName = imgFile;

            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Test);

            myTimer.Enabled = true;

        }

        catch

        {

        }

    }

    /// <summary>

    /// 记时器功能,自动保存截图

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void myTimer_Test(object sender, System.Timers.ElapsedEventArgs e)

    {

        if (!object.Equals(null, Session["ProcessID"]))

        {

            try

            {

                System.Diagnostics.Process prs = System.Diagnostics.Process.GetProcessById(int.Parse(Session["ProcessID"].ToString()));

                if (prs.HasExited)

                {

                    CatchImg(Session["flv"].ToString(), Session["img"].ToString());

                    catchFlvTool(Session["flv"].ToString());

                    myTimer.Enabled = false;

                    myTimer.Close();

                    myTimer.Dispose();

                    Session.Abandon();

                }

            }

            catch

            {

                CatchImg(Session["flv"].ToString(), Session["img"].ToString());

                catchFlvTool(Session["flv"].ToString());

                myTimer.Enabled = false;

                myTimer.Close();

                myTimer.Dispose();

                Session.Abandon();

            }

        }

    }

    #endregion

    public string catchFlvTool(string fileName)

    {

        //

        string flvtools = Server.MapPath(PublicMethod.flvtool);

        //

        string flv_xml = fileName.Replace(".flv", ".xml").Replace(PublicMethod.upFile.Replace("/", ""), PublicMethod.xmlFile.Replace("/", ""));

        //

        System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(flvtools);

        ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

        //

        ImgstartInfo.Arguments = "   " + fileName + "   -UPx   " + fileName + "  >  " + flv_xml;

        try

        {

            System.Diagnostics.Process.Start(ImgstartInfo);

        }

        catch

        {

            return "";

        }

        //

        if (System.IO.File.Exists(flv_xml))

        {

            return flv_xml;

        }

        return "";

    }

}

希望本文所述对大家的C#程序设计有所帮助。

 类似资料:
  • 本文向大家介绍js+HTML5实现视频截图的方法,包括了js+HTML5实现视频截图的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js+HTML5实现视频截图的方法。分享给大家供大家参考。具体如下: 1. HTML部分: 2. 点击按钮时触发如下代码: 希望本文所述对大家的javascript程序设计有所帮助。

  • 本文向大家介绍php使用ffmpeg获取视频信息并截图的实现方法,包括了php使用ffmpeg获取视频信息并截图的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php使用ffmpeg获取视频信息并截图的方法。分享给大家供大家参考,具体如下: 运行效果如下图所示: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《php操作office文档技巧总

  • 本文向大家介绍PHP获取youku视频真实flv文件地址的方法,包括了PHP获取youku视频真实flv文件地址的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP获取youku视频真实flv文件地址的方法。分享给大家供大家参考。具体分析如下: 有一站长要我帮助它做一个可以自动测试出youku视频网站的flv真实地址,下面我整理了一下午解决了此问题非常的不错,大家可参考一下. 这个

  • 问题内容: 我现在可以编译ffmpeg并将其添加到项目创建的Android.mk文件的jni文件夹中,我想使用ffmpeg从存储在静态arraylist中的图像创建视频文件 我已经搜索了很多,但找不到任何教程,对此表示感谢。 问题答案: 我也有类似的需求,并且达到了相同的目的。您可以通过两种方式执行此操作。我想先分享一个简单的例子。 在Android内部创建一个临时文件夹。 将图像复制到新文件夹中

  • 然后我尝试这样写音频帧: 问题是我从来不传递这个语句:“if(pkt.stream_index==st->index)”。数据包流索引从来不等于音频流索引。谁能指出我错在哪里? 更新: 顺便说一句,下面的答案没有帮助,因为它假设音频和视频流都来自同一个文件,而在我的情况下,只有音频来自外部源。

  • 本文向大家介绍H5播放的video视频,如何实现对视频截图?相关面试题,主要包含被问及H5播放的video视频,如何实现对视频截图?时的应答技巧和注意事项,需要的朋友参考一下