`
xiaoao808
  • 浏览: 43713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用commons upload+ffmpeg+mencoder完成视频的上传与转换

阅读更多

     前一段时间朱哥一直在搞视频转换这个东东,我也一直很有兴趣,就尝试了一下。

     首先是文件上传功能的完成,做得很粗糙,没有验证上传文件是否为视频文件。利用前一段时间看视频学来的部分代码很轻松搞定。

     接下来,就是视频转换了,我的ffmpeg和mencoder放在d:\ffmpeg目录中,代码如下

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.lc.test;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class CodeConven {

    
private static String OldPath;
    
private static String NewPath;


    
public static boolean process() {
    
int type = checkContentType();
    
boolean status = false;
    
if (type == 0) {
        status 
= processFLV(OldPath);// 直接将文件转为flv文件
    } else if (type == 1) {
        String avifilepath 
= processAVI(type);
        
if (avifilepath == null)
        
return false;// avi文件没有得到
        status = processFLV(avifilepath);// 将avi转为flv
    }
    
return status;
    }

    
private static int checkContentType() {
    String type 
= OldPath.substring(OldPath.lastIndexOf("."+ 1,
        OldPath.length()).toLowerCase();
    
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
    if (type.equals("avi")) {
        
return 0;
    } 
else if (type.equals("mpg")) {
        
return 0;
    } 
else if (type.equals("wmv")) {
        
return 0;
    } 
else if (type.equals("3gp")) {
        
return 0;
    } 
else if (type.equals("mov")) {
        
return 0;
    } 
else if (type.equals("mp4")) {
        
return 0;
    } 
else if (type.equals("asf")) {
        
return 0;
    } 
else if (type.equals("asx")) {
        
return 0;
    } 
else if (type.equals("flv")) {
        
return 0;
    }
    
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
    
// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
    else if (type.equals("wmv9")) {
        
return 1;
    } 
else if (type.equals("rm")) {
        
return 1;
    } 
else if (type.equals("rmvb")) {
        
return 1;
    }
    
return 9;
    }

    
private static boolean checkfile(String OldPath) {
    File file 
= new File(OldPath);
    
if (!file.isFile()) {
        
return false;
    }
    
return true;
    }

    
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
    private static String processAVI(int type) {
    List
<String> commend = new java.util.ArrayList<String>();
    commend.add(
"d:\\ffmpeg\\mencoder");
    commend.add(OldPath);
    commend.add(
"-oac");
    commend.add(
"lavc");
    commend.add(
"-lavcopts");
    commend.add(
"acodec=mp3:abitrate=64");
    commend.add(
"-ovc");
    commend.add(
"xvid");
    commend.add(
"-xvidencopts");
    commend.add(
"bitrate=600");
    commend.add(
"-of");
    commend.add(
"avi");
    commend.add(
"-o");
    commend.add(NewPath);
    
try {
        ProcessBuilder builder 
= new ProcessBuilder();
        builder.command(commend);
        builder.start();
        
return NewPath;
    } 
catch (Exception e) {
        e.printStackTrace();
        
return null;
    }
    }

    
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
    private static boolean processFLV(String oldfilepath) {

    
if (!checkfile(OldPath)) {
        System.out.println(oldfilepath 
+ " is not file");
        
return false;
    }

    List
<String> commend = new java.util.ArrayList<String>();
    commend.add(
"d:\\ffmpeg\\ffmpeg");
    commend.add(
"-i");
    commend.add(oldfilepath);
    commend.add(
"-y");
    commend.add(
"-ab");
    commend.add(
"32");
    commend.add(
"-ar");
    commend.add(
"22050");
    commend.add(
"-b");
    commend.add(
"800000");
    commend.add(
"-s");
    commend.add(
"640*480");
    commend.add(NewPath);
    
try {
        ProcessBuilder builder 
= new ProcessBuilder();
        builder.command(commend);
        builder.start();
        
return true;
    } 
catch (Exception e) {
        e.printStackTrace();
        
return false;
    }
    }

    
public String getOldPath() {
    
return OldPath;
    }

    
public void setOldPath(String oldPath) {
    OldPath 
= oldPath;
    }

    
public String getNewPath() {
    
return NewPath;
    }

    
public void setNewPath(String newPath) {
    NewPath 
= newPath;
    }
}

 

     写个测试类试了一下,挺好使的,转换的速度也还行。

     接下来就是要在上传类上略作修改,把转换的步骤加进去就ok了。

     以下是添加视频转换功能后的上传类代码:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.lc.test;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet {

    
private static final long serialVersionUID = 2431664260164700200L;
    
private ServletContext sc;
    
private String savePath;

    
/**
     * The doGet method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to get.
     * 
     * 
@param request
     *            the request send by the client to the server
     * 
@param response
     *            the response send by the server to the client
     * 
@throws ServletException
     *             if an error occurred
     * 
@throws IOException
     *             if an error occurred
     
*/
    
public void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        doPost(request, response);
    }

    
/**
     * The doPost method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to
     * post.
     * 
     * 
@param request
     *            the request send by the client to the server
     * 
@param response
     *            the response send by the server to the client
     * 
@throws ServletException
     *             if an error occurred
     * 
@throws IOException
     *             if an error occurred
     
*/
    
public void doPost(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        request.setCharacterEncoding(
"UTF-8");

        DiskFileItemFactory factory 
= new DiskFileItemFactory();
        ServletFileUpload upload 
= new ServletFileUpload(factory);

        
try {
            List items 
= upload.parseRequest(request);
            Iterator it 
= items.iterator();
            
while (it.hasNext()) {
                FileItem item 
= (FileItem) it.next();
                
if (item.isFormField()) {
                    System.out.println(
"表单的参数名称:" + item.getFieldName()
                            
+ ",对应的参数值:" + item.getString("UTF-8"));
                } 
else {
                    
if (item.getName() != null && !item.getName().equals("")) {
                        System.out.println(
"上传文件的大小:" + item.getSize());
                        System.out.println(
"上传文件的类型:" + item.getContentType());
                        System.out.println(
"上传文件的名称:" + item.getName());

                        File tempFile 
= new File(item.getName());
                        File file 
= new File(sc.getRealPath("/"+ savePath,
                                tempFile.getName());
                        item.write(file);
//                        System.out.println(sc.getRealPath("/") + savePath);
//                        request.setAttribute("upload.message", "上传文件成功!");
                        CodeConven cc= new CodeConven();
                        String oldfilename
=item.getName().substring(item.getName().lastIndexOf("\\")+1,item.getName().length()).toLowerCase();
                        String newfilename
=oldfilename.substring(0,oldfilename.lastIndexOf("."))+".flv";
                        String oldPath
=sc.getRealPath("/"+ savePath+"\\"+oldfilename;
                        String newPath
=sc.getRealPath("/"+"output\\"+newfilename;
//                        System.out.println("文件名:"+item.getName());
//                        System.out.println("原路径:"+oldPath);
//                        System.out.println("转换后路径:"+newPath);
                        cc.setOldPath(oldPath);
                        cc.setNewPath(newPath);
                        
if(cc.process()){
                            System.out.println(
"conven ok");
                        }

                    } 
else {
                        request.setAttribute(
"upload.message""没有选择上传文件!");
                    }
                }
                
            }
        } 
catch (Exception e) {
            e.printStackTrace();
            request.setAttribute(
"upload.message""上传文件不成功!");
        }
        
       request.getRequestDispatcher(
"/uploadResult.jsp").forward(request, response);
    }

    
public void init(ServletConfig config) {
        savePath 
= config.getInitParameter("savePath");
        sc 
= config.getServletContext();

    }

}

 

     ok了,写这个主要是为了实现,具体有其他不到位的地方还请大家指正啊。

 

源码下载

分享到:
评论

相关推荐

    commons-upload.jar资源包

    commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-upload.jar资源包commons-...

    java文件上传包 commonsio commons upload

    在文件上传过程中,`commons-fileupload`负责解析请求,找到包含文件的Part,并将其转换为FileItem对象。FileItem对象封装了文件的相关信息,如名称、内容、是否是文件等。以下是一个基本的使用示例: ```java ...

    commons Daemon+Procrun将java程序安装为windows服务的实例

    本资源是打包好的一套demo实例,适用于64位jre。如需32位请自行更换jre包或引用路径,同时更换支持32位的prunsrv.exe,相关32位和64位的工具请下载我的资源 commons Daemon+Procrun

    Apache commons包+源码

    Apache commons所有的包已经源码,包括commons-attributes-2.2.zip commons-beanutils-1.8.0-BETA.zip,commons-betwixt-0.8.zip, commons-chain-1.2-bin.zip,commons-cli-1.1.zip,commons-codec-1.3.zip等等,...

    Java commons upload 上传源代码

    commonfileupload 一般上传运用的SmartUpload 和...commons upload 使用缓存 上传限制减少 关键字:图片上传 文件上传 代码调试过了 没什么问题 注释也不少 其实多数还是网上的资源 只不过加工了下 让跑起来而已

    commons-upload

    在Java开发中,文件上传是一项常见的任务,Apache Commons项目中的`commons-upload`模块就是为了简化这一过程而设计的。Apache Commons FileUpload是Java的一个开源库,它提供了处理HTTP请求中的多部分数据(通常...

    my_upload+第二次重构三个java文件

    【标题】:“my_upload+第二次重构三个java文件”是一个关于Java文件上传的项目,其中包含了作者对Apache上传包的自定义实现和优化。这个项目可能是为了配合作者在博客上发表的系列文章“java之文件上传”,以帮助...

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    在Java Web开发中,文件的上传与下载是常见的功能需求,尤其在构建动态网站或Web应用程序时。本教程将深入讲解如何使用Java Servlet、Apache Commons IO库(版本2.4)以及Apache Commons FileUpload库(版本1.3)来...

    commons.jar +commons-beanutils.jar

    标题中的"commons.jar +commons-beanutils.jar"指的是Apache Commons项目中的两个核心组件:commons.jar和commons-beanutils.jar。Apache Commons是Java编程语言中的一系列小型实用程序库,为开发人员提供了各种常见...

    commons-upload使用

    标题 "commons-upload使用" 涉及到的是Apache Commons组件中的两个关键部分——Commons IO和Commons FileUpload,它们是Java中处理文件上传的重要工具。这篇博客文章可能详细介绍了如何利用这两个库来实现Web应用中...

    利用org.apache.commons.fileupload上传多个文件

    在本文中,我们将深入探讨如何利用该库实现多个文件的上传功能。 一、准备工作 在使用 Apache Commons FileUpload 进行文件上传之前,你需要确保以下组件已经准备就绪: 1. **引入依赖**:首先,你需要下载并添加...

    (zt)Commons-logging + Log4j 入门指南

    《Commons-Logging + Log4j 入门...总之,Commons-Logging与Log4j的组合提供了强大且灵活的日志解决方案,能够满足各种规模和类型的Java应用的需求。正确理解和使用这两个工具,将大大提升你的开发效率和问题排查能力。

    commons_beanutils+dbutils+fileupload+io.zip

    这个库极大地扩展了Java标准库中对输入/输出操作的支持,包括读写文件、复制流、处理字符串与字节流之间的转换、检测文件是否存在、读取文件内容、进行文件比较等等。 这四个库在Java Web开发中扮演着重要的角色,...

    Jakarta+Commons+学习

    【Jakarta Commons 学习】 Jakarta Commons 是一个由 Apache 软件基金会维护的 Java 开源项目集合,它提供了...通过深入学习 Jakarta Commons,Java 开发者可以更好地掌握和利用这些工具,提高代码质量和开发效率。

    commons-dbcp +commons-pool

    在实际应用中,DBCP利用Commons Pool提供的对象池机制来管理数据库连接。开发者可以通过配置DBCP的DataSource来设定连接池的各种参数,如初始连接数、最大连接数、空闲超时时间等。然后,应用程序可以通过DataSource...

    利用commons-fileupload上传组件上传文件(一)

    在本文中,我们将深入探讨如何使用Apache Commons FileUpload组件来实现文件上传功能。Apache Commons FileUpload是一个用于处理HTTP请求中的多部分数据的Java库,它使得在Servlet或JSP应用中处理文件上传变得简单易...

    commons-fileupload + commons-io-1.4.jar

    Apache Commons FileUpload与Apache Commons IO是Java开发中用于处理文件上传功能的重要库。这两个库的组合在处理HTTP请求中的文件上传部分尤其有用,特别是在Web应用中。下面将详细阐述这两个库的功能、使用方法...

    commons-fileupload组件和commons-io组件

    例如,当文件上传完成后,我们可以使用Commons-IO的工具类将文件移动到目标位置,或者进行进一步的处理。这两个组件极大地简化了Java Web开发中的文件操作,提高了开发效率。在初学者的项目中,它们是不可或缺的工具...

    commons+lang(API)

    Apache Commons Lang 是一个Java工具包,它为Java SE平台提供了许多实用功能,极大地扩展了Java标准库的功能。这个API包含了`org.apache.commons.lang`包及其子包中的所有组件,为开发者提供了一系列强大的类和方法...

Global site tag (gtag.js) - Google Analytics