视频分割项目预研_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 视频分割项目预研

视频分割项目预研

 2014/6/11 19:39:19  zhuyufufu  程序员俱乐部  我要评论(0)
  • 摘要:由于工作需要,研究下视频切割。现在的情况:视频切割是重中之重,后续项目功能按照这个功能来扩展的。由于ffmpeg名声太响,就从它开始了,开发平台暂时用windows;组件暂时用32位的。第一步:到ffmpeg官网下载ffmpeg组件http://www.ffmpeg.org/http://www.ffmpeg.org/download.htmlhttp://ffmpeg.zeranoe.com/builds/下载后的组件第二部:搭建Java项目新建Java项目添加日志jar包:log4j-1
  • 标签:项目
由于工作需要,研究下视频切割。

现在的情况:视频切割是重中之重,后续项目功能按照这个功能来扩展的。

由于ffmpeg名声太响,就从它开始了,开发平台暂时用windows;组件暂时用32位的。

第一步: 到ffmpeg官网下载ffmpeg组件

http://www.ffmpeg.org/
http://www.ffmpeg.org/download.html
http://ffmpeg.zeranoe.com/builds/
下载后的组件

 
第二部:搭建Java项目

新建Java项目
     
添加日志

jar包:log4j-1.2.13.jar

log4j配置
class="java" name="code">
# Global logging configuration
log4j.rootLogger=INFO,stdout,ADMINLOG,error

#log4j.logger.common=DEBUG
#log4j.category.common.TestLog4j=debug

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n
log4j.appender.stdout.Target=System.out
#File output...

log4j.appender.ADMINLOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ADMINLOG.Append=true
log4j.appender.ADMINLOG.DatePattern='_'yyyyMMdd'.log'
log4j.appender.ADMINLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.ADMINLOG.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c %x - %m%n
log4j.appender.ADMINLOG.File=Log.log
log4j.appender.ADMINLOG.Threshold=INFO

log4j.appender.error=org.apache.log4j.FileAppender
log4j.appender.error.File=log_error.log
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n 
log4j.appender.error.Threshold=ERROR



日志测试


配置配置文件
配置文件config.properties
ffmpeg_home=D:/ffmpeg/ffmpeg-20140611-git-b2fb65c-win32-static/

db_url=jdbc:oracle:thin:@localhost:1521:orcl
db_username=username
db_password=password


读取配置文件
package com.zas.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesUtil {
	private static Properties properties = new Properties();
	
	static{
		try {
			InputStream in = new FileInputStream(new File("config.properties"));
			properties.load(in);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static String get(String key){
		return properties.getProperty(key);
	}
	
	public static void set(String key, String value){
		properties.setProperty(key, value);
	}
	
	public static int getForInt(String key){
		String value = properties.getProperty(key);
		return Integer.valueOf(value);
	}
}


测试


第三步:使用ffmpeg获取视频信息
package com.zas.ffmpeg;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.zas.util.PropertiesUtil;

public class FFmpegHelloWord {
	static Logger logger = Logger.getLogger(FFmpegHelloWord.class);

	final static String FFMPEG_HOME = PropertiesUtil.get("ffmpeg_home");

	final static String TEST_FILE = "D:/ffmpeg/video/Wildlife.wmv";

	/**
	 * ffmpeg之旅开始 获取一个视频的基本信息
	 */
	private static void helloFFmpeg() {
		List<String> commandList = new ArrayList<String>();
		commandList.add(FFMPEG_HOME + "/bin/ffmpeg ");
		commandList.add("-i");
		commandList.add(TEST_FILE);

		ProcessBuilder builder = new ProcessBuilder();
		builder.command(commandList);
		builder.redirectErrorStream(true);
		//视频信息结果
		StringBuffer videoInfo = new StringBuffer();
		long beginTime = System.nanoTime();
		try {
			Process p = builder.start();
			//保存ffmpeg的输出结果流
			BufferedReader buf = null; 
			buf = new BufferedReader(new InputStreamReader(p.getInputStream()));
			
			String line = null;
			while ((line = buf.readLine()) != null) {
				logger.info(line);
				videoInfo.append(line);
			}
			p.waitFor();// 这里线程阻塞,将等待外部转换进程运行成功运行结束后,才往下执行

		} catch (IOException e) {
			e.printStackTrace();
			logger.error(e);
		} catch (InterruptedException e) {
			e.printStackTrace();
			logger.error(e);
		}
		long endTime = System.nanoTime();
		logger.info("处理耗时: " + (endTime - beginTime) / 1000000 + " 毫秒。 ");
		logger.info("视频信息: " + videoInfo);
	}

	public static void main(String[] args) {
		FFmpegHelloWord.helloFFmpeg();
	}

}

测试结果截图



然后再看一下怎么切割视频
package com.zas.ffmpeg;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.zas.util.PropertiesUtil;

public class VideoCutting {
	static Logger logger = Logger.getLogger(VideoCutting.class);

	final static String FFMPEG_HOME = PropertiesUtil.get("ffmpeg_home");

//	final static String TEST_FILE = "D:/ffmpeg/video/Wildlife.wmv";
	final static String TEST_FILE = "D:/ffmpeg/video/1111.wmv";
	
	final static String OUTPUT_PATH = "D:/ffmpeg/video/output.wmv";

	/**
	 * 使用ffmpeg 截取特定时长视频
	 */
	private static void cutting() {

		//ffmpeg -ss 00:5:28 -i "1111.wmv" -acodec copy -vcodec copy -t 00:03:25 output.wmv 
		//这行命令解释为:从文件 1111.wmv 第 5:28 分秒开始,截取 03: 25 的时间,其中视频和音频解码不变,输出文件名为 output.wmv 。 

		
		List<String> commandList = new ArrayList<String>();
		commandList.add(FFMPEG_HOME + "/bin/ffmpeg ");
		commandList.add("-ss");
		commandList.add("00:5:28");
		commandList.add("-i");
		commandList.add(TEST_FILE);
		commandList.add("-acodec");
		commandList.add("copy");
		commandList.add("-vcodec");
		commandList.add("copy");
		commandList.add("-t");
		commandList.add("00:03:25");
		commandList.add(OUTPUT_PATH);

		ProcessBuilder builder = new ProcessBuilder();
		builder.command(commandList);
		builder.redirectErrorStream(true);
		//视频信息结果
		StringBuffer videoInfo = new StringBuffer();
		long beginTime = System.nanoTime();
		try {
			Process p = builder.start();
			//保存ffmpeg的输出结果流
			BufferedReader buf = null; 
			buf = new BufferedReader(new InputStreamReader(p.getInputStream()));
			
			String line = null;
			while ((line = buf.readLine()) != null) {
				logger.info(line);
				videoInfo.append(line);
			}
			p.waitFor();// 这里线程阻塞,将等待外部转换进程运行成功运行结束后,才往下执行

		} catch (IOException e) {
			e.printStackTrace();
			logger.error(e);
		} catch (InterruptedException e) {
			e.printStackTrace();
			logger.error(e);
		}
		long endTime = System.nanoTime();
		logger.info("处理耗时: " + (endTime - beginTime) / 1000000 + " 毫秒。 ");
		logger.info("视频信息: " + videoInfo);
	}

	public static void main(String[] args) {
		VideoCutting.cutting();
	}

}


测试结果


之后就是处理多种格式的视频,音频;结合原有项目添加视频切割功能;处理大文件时的考量;配置测试linux环境的视频切割功能等等杂事。
  • 大小: 71.8 KB
  • 大小: 104.7 KB
  • 大小: 141.4 KB
  • 大小: 173.6 KB
  • log4j-1.2.13.jar (349.8 KB)
  • 下载次数: 0
  • 大小: 289.7 KB
  • 查看图片附件
发表评论
用户名: 匿名