`
CrazzyLee
  • 浏览: 26871 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java使用MEncoder将mp4和srt合成为flv格式的视频文件

阅读更多
本片文章主要介绍如何使用MEncoder进行视频转码(也包含使用ffmpeg插件进行无字幕视频转码)


准备工作:
1.下载ffmpeg插件包
地址:http://ffmpeg.org/download.html#releases

解压后目录结构为:
                 |-ffmpeg.exe
       |-bin  ---|-...
       |         |-...
       |        
ffmpeg |-doc  ---..
       |-licenses ---..
       |-presets  ---..
       |-README.TXT

2.下载mencoder插件包(也就是linux的MPlayer的整个包,mencoder是Mplayer的编码工具,MPlayer包内有这个插件mencoder.exe)
地址:http://www.mplayerhq.hu/design7/dload.html

         |-codecs ..
         |           |-font.conf
mencoder |-fonts-----|-conf.avail
         |           |-conf.d
         |
         |           |-codecs.conf
         |-mplayer---|-config
         |           |-input.conf
         |           |-subfont.ttf
         |
         |-mencoder.exe
         |-mplayer.exe
         |-vfw2menc.exe
         |-dsnative.dll

3.Eclipse建立一个简单的项目transferVideo


正式开始
1.创建一个接口:ICMDResponseGetter.java

package com.edu.ccnu.videocourse.ffmpeg;
/**
 * FFMPEG插件接口
 * @author Si.Li
 *
 */
public interface ICMDResponseGetter {

	/**
	 * 用来抓取命令行返回的信息
	 * @param str
	 */
	public void controlString(String str);
}


2.创建能够执行命令行并抓取命令行响应的Excuter类

package com.edu.ccnu.videocourse.ffmpeg;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
/**
 * 执行cmd的执行
 * @author Si.Li
 *
 */
public class CMDExcuter {

	public static void exec(List<String> cmd,ICMDResponseGetter getter){
		try{
			ProcessBuilder builder = new ProcessBuilder();
			builder.command(cmd);  
	        builder.redirectErrorStream(true);  
	        Process proc = builder.start();  
	        BufferedReader stdout = new BufferedReader(  
	                new InputStreamReader(proc.getInputStream()));  
	        String line;  
	        while ((line = stdout.readLine()) != null) {  
	            if( getter != null )  
	                getter.controlString(line);  
	        }  
	        proc.waitFor();     
	        stdout.close();  
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}


3.创建主类 VideoTransfer.java进行视频转码的工作,代码如下:


package com.edu.ccnu.videocourse.ffmpeg;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.edu.ccnu.videocourse.base.CommonConstants;

/**
 * VideoTransfer
 * @author Si.Li
 *
 */
public class VideoTransfer implements ICMDResponseGetter{
	
	/**
	 * 用来记录视频时长
	 */
	private int videoTimeCount=0;
	
	/**
	 * 可执行文件的路径
	 */
	private String ffmpegPath;
	
	/**
	 * 视频源文件地址
	 */
	private String sourceFilePath;
	
	/**
	 * FFMPEG 的一些自述状态
	 */
	private enum FFMpegUtilStatus { Empty, CheckingFile, GettingRuntime }; 

	/**
	 * 初始状态为Empty
	 */
	private FFMpegUtilStatus status = FFMpegUtilStatus.Empty;
	
	/**
	 * 用来装载cmd命令
	 */
	private List<String> cmd = new ArrayList<String>();
	
	/**
	 * 是否支持源文件格式的转换  Method : isSupported()
	 */
	private boolean isSupported; 
	
	/**
	 * 构造函数
	 * @param ffmpegPath FFMPEG可执行文件的绝对路径  例如 WINDOWS: e:/ffmpeg/ffmpeg.exe LINUX: /root/ffmpeg/bin/ffmpeg 
	 * @param sourceFilePath 处理视频的源文件绝对路径
	 * @param destinationFile 视频转换成FLV后的存储路径
	 */
	public VideoTransfer(String ffmpegPath,String sourceFilePath){
		this.ffmpegPath=ffmpegPath;
		this.sourceFilePath=sourceFilePath;
	}
	
	/**
	 * 获取视频时长
	 * @return
	 */
	public int getVideoTimeCount(){
		videoTimeCount = 0;
		//设置当前状态为获取时长
		status=FFMpegUtilStatus.GettingRuntime;
		cmd.clear();
		cmd.add(ffmpegPath);
		cmd.add("-i");
		cmd.add(sourceFilePath);
		CMDExcuter.exec(cmd, this);
		return videoTimeCount;
	}
	
	/**
	 * FFMPEG是否支持转换的源视频文件格式
	 * @return
	 */
	public boolean isSupported(){
		isSupported=true;
		status=FFMpegUtilStatus.CheckingFile;
		cmd.clear();
		cmd.add(ffmpegPath);
		cmd.add("-i");
		cmd.add(sourceFilePath);
		CMDExcuter.exec(cmd, this);
		return isSupported; //通过回调,isSupported值根据命令行响应会调整该值
	}
	
	/**
	 * 视频转换
	 * @param saveFilePath 存储路径,精确到 xxx.flv
	 * @param screenSize  屏幕分辨率 以:720x576 格式为准
	 * @param autoByte	 音频比特率 Kbps
	 * @param autocollection  音频采样率 HZ 
	 * @param quality 视频质量  (官方文档 1-31)
	 * @param fps 每秒帧率
	 */
	public void videoTransfer(String saveFilePath,String screenSize,Integer autoByte,Integer autocollection,Integer quality,Integer fps){
		cmd.clear();
		cmd.add(ffmpegPath);				//执行文件目录绝对路径例如 WINDOWS: e:/ffmpeg/ffmpeg.exe LINUX: /root/ffmpeg/bin/ffmpeg 
		cmd.add("-i");						//-i 后面指明源文件绝对路径,精确到 xx.视频格式
		cmd.add(sourceFilePath);  			//源文件绝对路径
		cmd.add("-y");	  					//设置转换的文件如果存在,那么直接覆盖
		cmd.add("-ab");   					//设置音频比特率
		cmd.add(autoByte.toString());  		//音频比特率值   Kbps为单位
		cmd.add("-ar");               		//设置音频采样率
		cmd.add(autocollection.toString()); //音频采样率值  HZ为单位
		cmd.add("-qscale");                 //设置视频质量,目前设置为1
		cmd.add(quality.toString());		
		cmd.add("-r");						//设置视频每秒帧数
		cmd.add(fps.toString());
		cmd.add("-s");						//设置视频分辨率
		cmd.add(screenSize);
		cmd.add(saveFilePath);
		CMDExcuter.exec(cmd, null);
	}
	
	
	/**
	 * 视频合成字幕转换
	 * @param saveFilePath  存储的FLV路径
	 * @param srtPath       字幕文件的物理路径
	 * @param mencoderPath  mencoder.exe的物理路径
	 */
	public void videoTransferByMencoder(String saveFilePath,String srtPath,String mencoderPath){
		cmd.clear();
		cmd.add(mencoderPath); 			//mencoder.exe的物理地址
		cmd.add(sourceFilePath);		//源文件的物理地址
		cmd.add("-o");					//目标文件地址(也就是转换后的物理地址,要精确到 xx.flv)
		cmd.add(saveFilePath);        
		cmd.add("-of");                 //指定输出格式
		cmd.add("lavf");
		cmd.add("-oac");                //指定输出音频编码
		cmd.add("mp3lame");
		cmd.add("-lameopts");
		cmd.add("abr:br="+CommonConstants.SOUND_AUDIOBYTE);
		cmd.add("-ovc");                //指定输出编码选择,
		cmd.add("lavc");
		cmd.add("-lavcopts");           //输出视频编码选项,参数较多,自行查询
		cmd.add("vcodec=flv");
		cmd.add("-srate");				//音频采样率
		cmd.add(CommonConstants.SOUND_SAMPLING.toString());
		cmd.add("-sub");                //字幕地址
		cmd.add(srtPath);
		cmd.add("-subfont");            //字幕ziti
		cmd.add("SimSun");
		cmd.add("-subcp");
		cmd.add("GB18030");
		cmd.add("-fontconfig");
		System.out.println(cmd.toString());
		CMDExcuter.exec(cmd, null);
	}
	
	/**
	 * 根据视频开始后的描述进行视频截图
	 * @param imagesSavePath 	存储图片的全路径  精确到   xxx.jpg
	 * @param begin 			设置视频截图在视频的第几秒内
	 * @param screenSize		截图的分辨率    格式参照:720x576
	 * 
	 */
	public void makeScreenImage(String imagesSavePath,Integer begin,String screenSize){
		cmd.clear();  
        cmd.add(ffmpegPath);  
        cmd.add("-i");  
        cmd.add(sourceFilePath);  
        cmd.add("-y");  
        cmd.add("-f");  
        cmd.add("image2");  
        cmd.add("-ss");  
        cmd.add(begin.toString());  
        cmd.add("-t");  
        cmd.add("0.001");  
        cmd.add("-s");  
        cmd.add(screenSize);  
        cmd.add(imagesSavePath);
        CMDExcuter.exec(cmd,null);
	}

	/**
	 * 执行CMDExcuter后,获取响应会回调本方法
	 * 本类主要用于   视频格式支持判断函数【isSupported()】和 获取视频时长函数【 getRunTime()】
	 */
	@Override
	public void controlString(String str) {
		switch( status )  
        {  
            case Empty:  
                break;  
            case CheckingFile:{				//检查是否能够支持当前文件的转换  
                Matcher m = Pattern.compile("Unknown format").matcher(str);  
                if( m.find() )  
                    this.isSupported = false;  
                break;  
            }  
            case GettingRuntime:{     //获取视频截图的时间  
            	String zz="Duration: ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])";
                Matcher m = Pattern.compile(zz).matcher(str);   
                while (m.find())   
                {  
                     String msg = m.group();  
                     msg = msg.replace("Duration: ", "");  
                     videoTimeCount=changeMsgToVideoCount(msg);
                     /**
                      * TODO msg Duration: 00:06:17,替换之后,不知道是否是 00:06:17先输出
                      */
                }  
                break;  
            }  
        }  
	}
	
	/**
	 * 将获取的视频时长字符串解析成
	 */
	private Integer changeMsgToVideoCount(String msg){
		Integer count=0;
		String [] times=msg.split(":");
		count+=Integer.parseInt(times[2]);
		count+=Integer.parseInt(times[1])*60;
		count+=Integer.parseInt(times[0])*60*60;
		return count;
	}
	
}





暂时这样吧,coding过程中已经将一部分注释写上了,以后完善
分享到:
评论

相关推荐

    用java程序调用ffmpeg执行视频文件格式转换flv

    在本文中,我们将深入探讨如何使用Java程序调用FFmpeg执行视频文件格式转换,特别是将非FFmpeg原生支持的格式转换为FLV格式。FFmpeg是一个强大的多媒体处理工具,支持多种视频、音频格式的编码、解码和转换。在这个...

    利用ffmpeg、mencoder转换视频格式为FLV格式

    FFmpeg和mencoder是两种广泛使用的开源工具,用于处理音视频文件,包括转换视频格式为FLV(Flash Video)格式。在本文中,我们将深入探讨这两个工具,了解它们的工作原理,以及如何使用它们来完成视频格式转换。 ...

    将多种视频文件转换为flv格式

    本篇文章将详述如何使用开源工具ffmpeg和mencoder将不同格式的视频文件转换为FLV(Flash Video)格式,以及如何从这些视频文件中提取第一帧作为图片。同时,我们还会提及如何在C#环境中调用这些工具,实现自动化处理...

    JAVA 利用 ffmpeg 和 mencoder 对视频进行转换

    本文将深入探讨如何使用Java结合FFmpeg和mencoder工具对视频进行转换。FFmpeg是一个强大的跨平台的命令行工具,用于处理音频和视频文件,而mencoder是MPlayer的一部分,同样用于视频编码和转换。 首先,让我们理解...

    ffmpeg+mencoder两种视频转换成flv的文件

    FFmpeg和MEncoder是两种广泛使用的开源视频处理工具,它们都可以将不同的视频格式转换为FLV(Flash Video)格式,适合在Web上进行流媒体播放。让我们深入了解一下这两个工具及其在视频转码过程中的应用。 FFmpeg是...

    ffmpeg和mencoder视频文件

    在Java开发中,它们经常被用作后台处理视频的工具,因为它们提供了强大的命令行接口来处理各种视频和音频格式。 FFmpeg是一个全面的、跨平台的解决方案,用于处理音频和视频流。它包括一系列的库(如libavcodec、...

    asp.net中将各种视频文件转换成.flv格式

    在ASP.NET环境中,将各种视频文件转换为FLV格式是一项常见的需求,特别是在处理在线视频流或构建媒体库时。此过程涉及多个步骤和技术组件,包括使用特定的编码工具(如FFmpeg和Mencoder)、配置应用设置、以及实现...

    java视频格式转换

    例如,将一个MP4视频转换为FLV格式,可以使用以下代码: ```java JAVE jave = new JAVE("input.mp4", "output.flv"); jave.addInputParam("-i", "input.mp4"); jave.addOutputParam("output.flv"); jave.execute();...

    基于FFMPEG和MENCODER的视频转换PHP网页.pdf

    在视频转换过程中,需要首先将视频文件上传到服务器,然后使用FFMPEG和MENCODER将其转换成FLV格式,最后将其嵌入PHP网页中。这个过程可以自动完成,无需人工干预。 PHP网页是指使用PHP语言编写的网页程序。PHP是一...

    mencoder视频格式转换+ffmpeg视频截图DEMO

    在这个命令中,`input_video.ext`是源文件,`output.flv`是目标文件,`-of lavf`指定输出格式为lavf(Libavformat),`-ovc lavc`指定使用lavc(Libavcodec)作为视频编码器,`-lavfopts format=flv`设定输出为FLV...

    mencoder视频转换程序

    例如,你可以使用以下命令将所有MP4格式的视频转换为AVI格式: ``` for file in $(cat video_queue.txt); do mencoder "$file" -oac mp3lame -lameopts abr:br=128 -ovc lavc -lavcopts vcodec=mpeg4 -o "${file%....

    mencoder视频转换工具

    使用mencoder,你可以将视频文件转换为不同的编码格式,如MPEG-1、MPEG-2、XviD、DivX、H.264等。此外,还可以调整输出视频的分辨率、比特率、帧率等参数,以适应不同的设备或网络条件。 3. **音频处理** 不仅...

    ffmpeg+mencoder

    与FFmpeg相比,Mencoder在某些特定的视频转码任务上可能更加高效,但它的功能相对较为单一,主要用于视频文件的格式转换和质量调整。Mencoder支持的编码格式包括MPEG-1/2、DVD、VCD、SVCD等,对于旧版的编码格式支持...

    mencoder xxx to flv

    标题 "mencoder xxx to flv" 指的是使用 mencoder 这个工具将某个视频文件(xxx)转换为 FLV 格式的过程。mencoder 是 MPlayer 的一个命令行工具,广泛用于视频编码和格式转换。在本文中,我们将深入探讨 mencoder ...

    视频转码工具ffmpeg.exe和mencoder.exe

    例如,如果你需要将一个MP4视频转换为WebM格式,你可以使用以下命令: ``` ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 1M -c:a libvorbis output.webm ``` 在这个命令中,`-i`指定输入文件,`-c:v libvpx-vp...

    Java使用ffmpeg和mencoder实现视频转码

    视频转码是将视频文件从一种格式转换为另一种格式的过程,例如从AVI转换为MP4或从MOV转换为FLV等。 在本文中,我们将详细介绍如何使用Java语言调用ffmpeg和mencoder来实现视频转码。首先,我们需要下载ffmpeg和...

    asp.net 视频格式转换成flv格式

    总之,ASP.NET结合mencoder或ffmpeg可以实现视频格式转换服务,将用户上传的各种视频格式转换为适合在网络流式传输的FLV格式。这个过程涉及到文件上传、服务器端处理、文件存储、错误处理和视频播放等多个环节,体现...

    Mencoder实现视频剪切合并添加字幕

    Mencoder是MPlayer的一个附属工具,它主要用于视频的编码、转换和处理,包括视频剪切、合并以及添加字幕等功能。在本文中,我们将详细探讨如何利用Mencoder进行这些操作,以便于您更好地理解和掌握这一强大的命令行...

    基于mencoder实现的视频截取合并demo

    本教程将深入探讨如何使用mencoder工具来实现视频的截取与合并,并添加字幕功能。mencoder是MPlayer项目的衍生产品,是一个强大的命令行视频编码工具,能够处理各种格式的视频文件。 首先,我们来了解视频截取的...

Global site tag (gtag.js) - Google Analytics