Csharp/C#教程:C#实现通过ffmpeg从flv视频文件中截图的方法分享

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

需要先下载ffmpeg,这是开源的,代码如下所示:
代码如下:usingSystem;
usingSystem.Configuration;
publicclassPublicMethod:System.Web.UI.Page
{
   publicPublicMethod()
   {
   }
   //文件路径
   publicstaticstringffmpegtool=”ffmpeg/ffmpeg.exe”;        
   publicstaticstringmencodertool=”mencoder/mencoder.exe”;
   publicstaticstringflvtool=”flvtool/flvtool2.exe”;//flv标记工具
   publicstaticstringupFile=”UpFiles”+”/”;//上传文件夹
   publicstaticstringimgFile=”ImgFile”+”/”;//图片文件夹
   publicstaticstringplayFile=”PlayFiles”+”/”;//flv文件夹
   publicstaticstringxmlFile=”xmlFiles”+”/”;//xml文件夹
   publicstaticstringsizeOfImg=”240×180″;//图片的宽与高
   publicstaticstringwidthOfFile=”400″;//flv文件的宽度
   publicstaticstringheightOfFile=”350″;//flv文件的高度
   //publicstaticstringffmpegtool=ConfigurationManager.AppSettings[“ffmpeg”];
   //publicstaticstringmencodertool=ConfigurationManager.AppSettings[“mencoder”];
   //publicstaticstringupFile=ConfigurationManager.AppSettings[“upfile”]+”/”;
   //publicstaticstringimgFile=ConfigurationManager.AppSettings[“imgfile”]+”/”;
   //publicstaticstringplayFile=ConfigurationManager.AppSettings[“playfile”]+”/”;
   //文件图片大小
   //publicstaticstringsizeOfImg=ConfigurationManager.AppSettings[“CatchFlvImgSize”];
   //文件大小
   //publicstaticstringwidthOfFile=ConfigurationManager.AppSettings[“widthSize”];
   //publicstaticstringheightOfFile=ConfigurationManager.AppSettings[“heightSize”];
   //  ////获取文件的免费精选名字大全
   privateSystem.Timers.TimermyTimer=newSystem.Timers.Timer(3000);//记时器
   publicstaticstringflvName=””;
   publicstaticstringimgName=””;
   publicstaticstringflvXml=””;
   publicstaticintpId=0;
   publicstaticstringGetFileName(stringfileName)
   {
       inti=fileName.LastIndexOf(“”)+1;
       stringName=fileName.Substring(i);
       returnName;
   }
   //获取文件扩展名
   publicstaticstringGetExtension(stringfileName)
   {
       inti=fileName.LastIndexOf(“.”)+1;
       stringName=fileName.Substring(i);
       returnName;
   }
   //
   #region//运行FFMpeg的视频解码,(这里是绝对路径)
   ///<summary>
   ///转换文件并保存在指定文件夹下面(这里是绝对路径)
   ///</summary>
   ///<paramname=”fileName”>上传视频文件的路径(原文件)</param>
   ///<paramname=”playFile”>转换后的文件的路径(网络播放文件)</param>
   ///<paramname=”imgFile”>从视频文件中抓取的图片路径</param>
   ///<returns>成功:返回图片虚拟地址;  失败:返回空字符串</returns>
   publicvoidChangeFilePhy(stringfileName,stringplayFile,stringimgFile)
   {
       //取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add  key=”ffmpeg”  value=”E:aspx1ffmpeg.exe”  /> 
       stringffmpeg=Server.MapPath(PublicMethod.ffmpegtool);
       if((!System.IO.File.Exists(ffmpeg))||(!System.IO.File.Exists(fileName)))
       {
           return;
       }
       //获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg 
       stringflv_file=System.IO.Path.ChangeExtension(playFile,”.flv”);
       //截图的尺寸大小,配置在Web.Config中,如:<add  key=”CatchFlvImgSize”  value=”240×180″  /> 
       stringFlvImgSize=PublicMethod.sizeOfImg;
       System.Diagnostics.ProcessStartInfoFilestartInfo=newSystem.Diagnostics.ProcessStartInfo(ffmpeg);
       FilestartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
       FilestartInfo.Arguments=”-i”+fileName+”-ab56-ar22050-b500-r15-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截图
   publicstringCatchImg(stringfileName,stringimgFile)
   {
       //
       stringffmpeg=Server.MapPath(PublicMethod.ffmpegtool);
       //
       stringflv_img=imgFile+”.jpg”;
       //
       stringFlvImgSize=PublicMethod.sizeOfImg;
       //
       System.Diagnostics.ProcessStartInfoImgstartInfo=newSystem.Diagnostics.ProcessStartInfo(ffmpeg);
       ImgstartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
       //
       ImgstartInfo.Arguments=”  -i  “+fileName+” -y -f image2  -ss2-vframes1 -s  “+FlvImgSize+”  “+flv_img;
       try
       {
           System.Diagnostics.Process.Start(ImgstartInfo);
       }
       catch
       {
           return””;
       }
       //
       catchFlvTool(fileName);
       if(System.IO.File.Exists(flv_img))
       {
           returnflv_img;
       }
       return””;
   }
   #endregion
   #region//运行FFMpeg的视频解码,(这里是(虚拟)相对路径)
   ///<summary>
   ///转换文件并保存在指定文件夹下面(这里是相对路径)
   ///</summary>
   ///<paramname=”fileName”>上传视频文件的路径(原文件)</param>
   ///<paramname=”playFile”>转换后的文件的路径(网络播放文件)</param>
   ///<paramname=”imgFile”>从视频文件中抓取的图片路径</param>
   ///<returns>成功:返回图片虚拟地址;  失败:返回空字符串</returns>
   publicvoidChangeFileVir(stringfileName,stringplayFile,stringimgFile)
   {
       //取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add  key=”ffmpeg”  value=”E:aspx1ffmpeg.exe”  /> 
       stringffmpeg=Server.MapPath(PublicMethod.ffmpegtool);
       if((!System.IO.File.Exists(ffmpeg))||(!System.IO.File.Exists(fileName)))
       {
           return;
       }
       //获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg 
       stringflv_img=System.IO.Path.ChangeExtension(Server.MapPath(imgFile),”.jpg”);
       stringflv_file=System.IO.Path.ChangeExtension(Server.MapPath(playFile),”.flv”);
       //截图的尺寸大小,配置在Web.Config中,如:<add  key=”CatchFlvImgSize”  value=”240×180″  /> 
       stringFlvImgSize=PublicMethod.sizeOfImg;
       System.Diagnostics.ProcessStartInfoFilestartInfo=newSystem.Diagnostics.ProcessStartInfo(ffmpeg);
       FilestartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
       //此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg  0.4.9调试通过
       //ffmpeg-iF:1.wmv-ab56-ar22050-b500-r15-s320x240f:test.flv
       FilestartInfo.Arguments=”-i”+fileName+”-ab56-ar22050-b500-r15-s”+widthOfFile+”x”+heightOfFile+””+flv_file;
       try
       {
           System.Diagnostics.Processps=newSystem.Diagnostics.Process();
           ps.StartInfo=FilestartInfo;
           ps.Start();
           Session.Add(“ProcessID”,ps.Id);
           Session.Add(“flv”,flv_file);
           Session.Add(“img”,imgFile);
           myTimer.Elapsed+=newSystem.Timers.ElapsedEventHandler(myTimer_Test);
           myTimer.Enabled=true;
       }
       catch
       {
       }
   }
   #endregion
   #region//运行mencoder的视频解码器转换(这里是(绝对路径))
   publicvoidMChangeFilePhy(stringvFileName,stringplayFile,stringimgFile)
   {
       stringtool=Server.MapPath(PublicMethod.mencodertool);
       //stringmplaytool=Server.MapPath(PublicMethod.ffmpegtool);
       if((!System.IO.File.Exists(tool))||(!System.IO.File.Exists(vFileName)))
       {
           return;
       }
       stringflv_file=System.IO.Path.ChangeExtension(playFile,”.flv”);
       //截图的尺寸大小,配置在Web.Config中,如:<add  key=”CatchFlvImgSize”  value=”240×180″  /> 
       stringFlvImgSize=PublicMethod.sizeOfImg;
       System.Diagnostics.ProcessStartInfoFilestartInfo=newSystem.Diagnostics.ProcessStartInfo(tool);
       FilestartInfo.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;
       FilestartInfo.Arguments=””+vFileName+”-o”+flv_file+”-oflavf-lavfoptsi_certify_that_my_video_stream_does_not_use_b_frames-oacmp3lame-lameoptsabr:br=56-ovclavc-lavcoptsvcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=1:dia=-1:cmp=0:vb_strategy=1-vfscale=”+widthOfFile+”:”+heightOfFile+”-ofps12-srate22050″;
       try
       {
           System.Diagnostics.Processps=newSystem.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+=newSystem.Timers.ElapsedEventHandler(myTimer_Test);
           myTimer.Enabled=true;
       }
       catch
       {
       }
   }
   ///<summary>
   ///记时器功能,自动保存截图
   ///</summary>
   ///<paramname=”sender”></param>
   ///<paramname=”e”></param>
   privatevoidmyTimer_Test(objectsender,System.Timers.ElapsedEventArgse)
   {
       if(!object.Equals(null,Session[“ProcessID”]))
       {
           try
           {
               System.Diagnostics.Processprs=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
   publicstringcatchFlvTool(stringfileName)
   {
       //
       stringflvtools=Server.MapPath(PublicMethod.flvtool);
       //
       stringflv_xml=fileName.Replace(“.flv”,”.xml”).Replace(PublicMethod.upFile.Replace(“/”,””),PublicMethod.xmlFile.Replace(“/”,””));
       //
       System.Diagnostics.ProcessStartInfoImgstartInfo=newSystem.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))
       {
           returnflv_xml;
       }
       return””;
   }
}

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

您可能感兴趣的文章:ffmpeg中文参数详细说明PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件快速解决Android平台移植ffmpeg的一些问题PHP中使用FFMPEG获取视频缩略图和视频总时长实例利用Ffmpeg获得flv视频缩略图和视频时间的代码java调用ffmpeg实现视频转换的方法利用nginx与ffmpeg搭建流媒体服务器过程详解PHP使用FFmpeg获取视频播放总时长与码率等信息MacOS下为AndroidStudio编译FFmpeg解码库的详细教程php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间php使用ffmpeg获取视频信息并截图的实现方法详解NODEJS基于FFMPEG视频推流测试php调用ffmpeg获取视频信息的简单实现python调用系统ffmpeg实现视频截图、http发送php利用ffmpeg提取视频中音频与视频画面的方法详解Java实现对视频进行截图的方法【附ffmpeg下载】PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法Centos6.5下PHP5.3安装ffmpeg扩展的步骤详解ffmpeg中文参数说明与使用示例

标签: ffmpeg 方法 fm mp ff fl ffm

STL priority_queue(优先队列)详解

C++中getline()和get()的方法浅析

上述就是C#学习教程:C#实现通过ffmpeg从flv视频文件中截图的方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/906068.html

(0)
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐