上传视频并转换为flv,抓取第一帧生面图片

news/2024/7/10 20:49:29 标签: ffmpeg, 数据库, ui

---源码下载----

WEB.config配置节如下

     < appSettings >


        
<!-- 工具文件夹 -->
        
< add key = " ffmpeg "  value = " ffmpeg/ffmpeg.exe " />
        
< add key = " mencoder "  value = " mencoder/mencoder.exe " />
        
< add key = " mplayer "  value = " mencoder/mplayer.exe " />
        
<!-- 上传文件的路径 -->
        
< add key = " upfile "  value = " UpFiles " />
        
<!-- 上专文件图片路径 -->
        
< add key = " imgfile "  value = " ImgFile " />
        
<!-- 上传文件图片大小 -->
        
< add key = " CatchFlvImgSize "  value = " 240x180 " />
        
< add key = " widthSize "  value = " 400 " />
        
< add key = " heightSize "  value = " 350 " />
        
<!-- 转换后文件路径 -->
        
< add key = " playfile "  value = " PlayFiles " />

    
</ appSettings >

 

上传类:

 

namespace  VideoToFLV
{
    
public   class  PublicMethod:System.Web.UI.Page
    {
          
public  PublicMethod()
    {
        
    }
    
// 文件路径
     public   static   string  ffmpegtool  =  ConfigurationManager.AppSettings[ " ffmpeg " ];
    
public   static   string  mencodertool  =  ConfigurationManager.AppSettings[ " mencoder " ];
    
public   static   string  mplayertool  =  ConfigurationManager.AppSettings[ " mplayer " ];
    
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 " ];
    
//
    
//
    
// 获取文件的名字
     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   string  ChangeFilePhy( string  fileName,  string  playFile,  string  imgFile)
    {
        
// 取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add  key="ffmpeg"  value="E:\51aspx\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_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
        {
            
return   "" ;
        }
        
//
         return   "" ;
    }
    
//
     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   "" ;
        }
        
//
         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   string  ChangeFileVir( string  fileName,  string  playFile,  string  imgFile)
    {
        
// 取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add  key="ffmpeg"  value="E:\51aspx\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);
        System.Diagnostics.ProcessStartInfo ImgstartInfo 
=   new  System.Diagnostics.ProcessStartInfo(ffmpeg);

        FilestartInfo.WindowStyle 
=  System.Diagnostics.ProcessWindowStyle.Hidden;
        ImgstartInfo.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;
        ImgstartInfo.Arguments 
=   "   -i   "   +  fileName  +   "   -y  -f  image2  -t  0.001  -s   "   +  FlvImgSize  +   "   "   +  flv_img;

        
try
        {
            System.Diagnostics.Process.Start(FilestartInfo);
            System.Diagnostics.Process.Start(ImgstartInfo);
        }
        
catch
        {
            
return   "" ;
        }

        
/// 注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;  
        
/// 这儿需要延时后再检测,我服务器延时8秒,即如果超过8秒图片仍不存在,认为截图失败;  
        
/// 此处略去延时代码.如有那位知道如何捕捉ffmpeg.exe截图失败消息,请告知,先谢过!  
         if  (System.IO.File.Exists(flv_img))
        {
            
return  flv_img;
        }

        
return   "" ;
    }
    
#endregion

    
#region
    
// 运行mencoder的视频解码器转换(这里是(绝对路径))
     public   string  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.Start(FilestartInfo);
            CatchImg(flv_file, imgFile);
        }
        
catch
        {
            
return   "" ;
        } 
        
//
         return   "" ;
    }
    
#endregion

    }
}

转载于:https://www.cnblogs.com/weichuo/archive/2008/11/25/1340554.html


http://www.niftyadmin.cn/n/538948.html

相关文章

java的new意义_JAVA高手指点一下NEW到底是什么意义?

明白了 你看 上面的程序里 有 a new A() 是实例化一个新 对象 新对象的 i 而不影响main方法中的 变量i而下面的 没有 出入的对象 的新实例化package com.wu.xiao.yu;class A {int i 0;}public class Test {public static void add(A a) {System.out.println("传入是参数 …

JUDE/Professional中文版

JUDE 是一款全新的轻量级 UML 建模工具&#xff0c;支持 UML1.4 规范中定义的所有图&#xff0c;并且创新地集成了思维导图和 UML 。采用 100% 纯 JAVA 构建的 JUDE 可以实现跨平台应用。 JUDE 不仅能够实现分布式建模、项目合并&#xff0c;还能够实现和其他建模工具的交互。 …

java 队列 array_在java中使用Array实现队列

队列是一种特殊类型的集合&#xff0c;旨在在处理之前保存元素&#xff0c;并以FIFO(先进先出)方式对元素进行排序。 它是java集合框架的一部分。在这里&#xff0c;尝试使用数组实现Queue&#xff0c;并提供基本功能&#xff0c;如&#xff1a;enqueue(obj)&#xff0c;dequeu…

服务器监控资料分享之-RRDTools

这些天一直在做服务器的监控.确实挺累. 在服务器监控这一块,目前使用最多的,是cacti cacti里面主要使用了snmp和rrdtool 同时也可以有很多插件,是使用php开发的一套服务器监控软件. 本来公司用的挺好的, 但无奈缺少报警与预警功能.而公司的主流语言是java,所以就拿java来写另一…

对《自定义GridView分页模板中页码Button的实现》中程序的改进,追加显示空行功能...

昨天写完《自定义GridView分页模板中页码Button的实现》后发现一个问题&#xff0c;因为分页后的数据行数不是正好为满页的&#xff0c;所以最后一页就会变成下面第二幅图的样子&#xff1a; 到网上一查&#xff0c;呵呵查到了两篇文章。然后&#xff0c;还是对文章的代码修改了…

读书时的软件开发梦

读大学时&#xff0c;对软件开发比较感兴趣&#xff0c;希望将来可以从事操作系统、编译器或IDE开发。 现在工作多年&#xff0c;做的都是应用程序开发。 因为当时希望中国出现一家大的软件公司&#xff0c;可以在里面工作。 现在也没看到这样的公司。 软件业犹如传统行业&…

gibbslda java_JGibbLDA、GibbsLDA++问题解决

LDA(Latent Dirichlet Allocation )主题模型是一种用统计进行文本挖掘的方法&#xff0c;它是pLSA(概率潜在语义分析)主题模型基础上加上贝叶斯框架而得到的模型。目前已应用于自然语言处理、计算机视觉、机器学习、信息检索等领域&#xff0c;得到了广泛关注。LDA模型网上有多…