当前位置: 首页 > news >正文

ffmpeg视频转换及截图

 

ffmpeg是用于视频转换等方面的工具。前几天想做个视频转换和截图的功能,才对这个东东了了解了皮毛。具体官网http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5。

了解不深,不过对于我想要的两个功能倒是实现了,和有这方面功能需求的友们分享下。

1.首先下载ffmpeg的文件。

2.视频转换功能。可以将多种视频格式转换为flv格式。我目前测试了wma,rm,avi,mod等都成功了。

 

ExpandedBlockStart.gif 代码
     ///   <summary>
    
///  视频(avi,mov等等格式)转换为flv格式视频
    
///   </summary>
    
///   <param name="FromName"> 被转换的视频文件 </param>
    
///   <returns></returns>
     public   string  VideoConvertFlv( string  FromName)
    {
        
string  ffmpeg  =  Server.MapPath( " . " +   "  \\ffmpeg\\ffmpeg.exe " ;
        
string  ExportName  =   " flv "   +   " \\ "   +  DateTime.Now.ToString( " yyyyMMddhhmmss " +   " .flv " ;
        
string  WidthAndHeight  =   " 320x240 " ;
        System.Diagnostics.ProcessStartInfo startInfo 
=   new  System.Diagnostics.ProcessStartInfo(ffmpeg);
        startInfo.WindowStyle 
=  System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.Arguments 
=   "  -i  "   +  Server.MapPath(FromName)  +   "  -ab 56 -ar 22050 -b 500 -r 15 -s  "   +  WidthAndHeight  +   "   "   +  Server.MapPath(ExportName);
        
try
        {
            System.Diagnostics.Process.Start(startInfo);
            
return  ExportName;
        }
        
catch  (Exception err)
        {
            
return  err.Message;
        }
    }

 

调用的时候传入原文件所在的路径即可。上述方法中使用的是相对路径

 

   protected   void  btnConvert_Click( object  sender, EventArgs e)
    {
        
string  result  =  VideoConvertFlv( " Upload\\Training1.avi " );
        Response.Write(result);
    }

 

 

 

2。视频截图:对于选定的视频,截取指定时间的缩略图。

 

ExpandedBlockStart.gif 代码
///   <summary>
    
///  从视频画面中截取一帧画面为图片
    
///   </summary>
    
///   <param name="VideoName"> 视频文件pic/guiyu.mov </param>
    
///   <param name="WidthAndHeight"> 图片的尺寸如:240*180 </param>
    
///   <param name="CutTimeFrame"> 开始截取的时间如:"1" </param>
    
///   <returns></returns>
     public   string  GetPicFromVideo( string  VideoName,  string  WidthAndHeight,  string  CutTimeFrame)
    {

        
string  ffmpeg  =  Server.MapPath( " . " +   "  \\ffmpeg\\ffmpeg.exe " ;

        
string  PicName  =  Server.MapPath( " img\\ "   +  DateTime.Now.ToString( " yyyyMMddhhmmss " +   " .jpg " );
        System.Diagnostics.ProcessStartInfo startInfo 
=   new  System.Diagnostics.ProcessStartInfo(ffmpeg);
        startInfo.WindowStyle 
=  System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.Arguments 
=   "  -i  "   +  Server.MapPath(VideoName)  +   "  -y -f image2 -ss  "   +  CutTimeFrame  +   "  -t 0.001 -s  "   +  WidthAndHeight  +   "   "   +  PicName;
        
try
        {
            System.Diagnostics.Process.Start(startInfo);
            
return  PicName;
        }
        
catch  (Exception err)
        {
            
return  err.Message;
        }
    }

 

方法参数可以根据实际情况进行调整。调用方法为:

 

string  url  =  GetPicFromVideo( " Upload\\Training1.avi " " 240*180 " " 1 " );

 

 

至此,视频转换为flv和截取视频缩略图的功能就实现了。

-------------------------------------------------------

续:

由于视频上传及转换的过程是需要一段时间的,在这段时间之内调用截图的方法,就会失败。因为现在flv文件还没有生成完毕呢。这种情况一般好像是在多线程处理的时候容易遇到,在这方面经验还比较不足,就是感觉是顺序调用而已,并没有使用多线程。。其实还是没有完全搞透,有明白的高手指点下哈。

后来我查了点资料,最后发现只要修改执行的那段代码就可以了:

修改前:

 

try
        {
            System.Diagnostics.Process.Start(startInfo);
            
return  PicName;
        }

 

 

修改后:

 

 

    try
        {
            Process proc 
=  Process.Start(startInfo);
            proc.WaitForExit();
            
return  ExportName;
        }

 

 这样就可以控制程序一步步的执行了。

 

 应园友要求,我将代码做了个压缩包,共同学习/Files/janes/Video.7z
注意:由于ffmpeg.exe文件超过上传大小限制,所以请大家自行下载,并且放在目录ffmpeg下面。

相关文章:

  • 交换机的背板容量、交换容量和包转发能力有何区别?
  • 寻找迷失的自己
  • html meta 之 http-equiv
  • 项目管理经验谈——来自项目管理群的讨论
  • 走向.NET架构设计—第五章—业务层模式,原则,实践(前篇)
  • 批量删除数据库中所有表的记录(清空数据库)
  • 搭建基于mantisbt的bug跟踪管理系统
  • centos 5.0 open***安装
  • VMware VDI(VMware View 4.5)安装配置教程-9 登陆view桌面
  • 在企业网络中部署***备份技术
  • windows hpc 2008 server请求帮助
  • [转载].振南带你入门FAT32文件系统 视频
  • Java中静态块和实例块
  • 我所了解的操作系统知识
  • 云领天下(一): 最近的云计算 - IaaS
  • css的样式优先级
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • k8s如何管理Pod
  • Objective-C 中关联引用的概念
  • Redis在Web项目中的应用与实践
  • RxJS: 简单入门
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • web标准化(下)
  • 排序算法学习笔记
  • 数组的操作
  • 项目实战-Api的解决方案
  • 转载:[译] 内容加速黑科技趣谈
  • ionic入门之数据绑定显示-1
  • # 飞书APP集成平台-数字化落地
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (007)XHTML文档之标题——h1~h6
  • (C语言)逆序输出字符串
  • (day 12)JavaScript学习笔记(数组3)
  • (HAL库版)freeRTOS移植STMF103
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (笔试题)分解质因式
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 中的轻量级线程安全
  • .NET序列化 serializable,反序列化
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @Autowired @Resource @Qualifier的区别
  • @Query中countQuery的介绍
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [Angular] 笔记 21:@ViewChild
  • [BUUCTF 2018]Online Tool
  • [BZOJ2208][Jsoi2010]连通数
  • [C++]——带你学习类和对象
  • [Enterprise Library]调用Enterprise Library时出现的错误事件之关闭办法