`
zhuyufufu
  • 浏览: 134654 次
  • 性别: Icon_minigender_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配置
# 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
  • 大小: 289.7 KB
2
1
分享到:
评论
5 楼 xiang37 2014-06-12  
http://xiva.iteye.com/blog/2066590  可以参考一下我博客写的,使用dll操作的,不过功能没有接全,也可以移植到liunx平台。
4 楼 I白I 2014-06-12  
怎么还配置数据库了?
3 楼 zhuyufufu 2014-06-12  
freezingsky 写道
bewithme 写道
好文章,这个东东能把视频文件切成一张张图片吗?

相当于截屏!


可以的,这就相当于把视频按帧分割
2 楼 freezingsky 2014-06-11  
bewithme 写道
好文章,这个东东能把视频文件切成一张张图片吗?

相当于截屏!
1 楼 bewithme 2014-06-11  
好文章,这个东东能把视频文件切成一张张图片吗?

相关推荐

Global site tag (gtag.js) - Google Analytics