视频分割项目预研

由于工作需要,研究下视频切割。

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

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

[b]第一步: 到ffmpeg官网下载ffmpeg组件[/b]

[url]http://www.ffmpeg.org/[/url]
[url]http://www.ffmpeg.org/download.html[/url]
[url]http://ffmpeg.zeranoe.com/builds/[/url]
下载后的组件
[img]http://dl2.iteye.com/upload/attachment/0098/0085/1dd621fc-fd86-3c1a-a1c1-51d985399570.jpg[/img]

[b]第二部:搭建Java项目[/b]

新建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



日志测试
[img]http://dl2.iteye.com/upload/attachment/0098/0095/14ea32b1-a15f-3088-9a3a-0d1a5c309bf0.jpg[/img]

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


测试
[img]http://dl2.iteye.com/upload/attachment/0098/0099/cda66778-f3e5-3d15-9549-86d9c7300f77.jpg[/img]

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

}

测试结果截图
[img]http://dl2.iteye.com/upload/attachment/0098/0140/65cb42ea-8344-383e-8488-6bb36804133f.jpg[/img]


然后再看一下怎么切割视频

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();
}

}


测试结果
[img]http://dl2.iteye.com/upload/attachment/0098/0162/3c44c7be-b43c-31bf-9194-c845098dafe0.jpg[/img]

之后就是处理多种格式的视频,音频;结合原有项目添加视频切割功能;处理大文件时的考量;配置测试linux环境的视频切割功能等等杂事。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值