由于工作需要,
研究下视频切割。
现在的情况:
视频切割是重中之重,后续项目功能按照这个功能来扩展的。
由于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