欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

视频分割项目预研 博客分类: 编程相关Java相关 javaffmpeg入门 

程序员文章站 2024-03-24 10:55:04
...
由于工作需要,研究下视频切割。

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

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

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

http://www.ffmpeg.org/
http://www.ffmpeg.org/download.html
http://ffmpeg.zeranoe.com/builds/
下载后的组件
视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 
 
第二部:搭建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



日志测试
视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 

配置配置文件
配置文件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);
	}
}


测试
视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 

第三步:使用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();
	}

}

测试结果截图
视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 


然后再看一下怎么切割视频
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();
	}

}


测试结果
视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 

之后就是处理多种格式的视频,音频;结合原有项目添加视频切割功能;处理大文件时的考量;配置测试linux环境的视频切割功能等等杂事。
  • 视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 
  • 大小: 71.8 KB
  • 视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 
  • 大小: 104.7 KB
  • 视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 
  • 大小: 141.4 KB
  • 视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 
  • 大小: 173.6 KB
  • 视频分割项目预研
            
    
    博客分类: 编程相关Java相关 javaffmpeg入门 
  • 大小: 289.7 KB
相关标签: java ffmpeg入门