本文实例讲述了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中文参数说明与使用示例
STL priority_queue(优先队列)详解
C++中getline()和get()的方法浅析
上述就是C#学习教程:C#实现通过ffmpeg从flv视频文件中截图的方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/906068.html