视频分割项目预研 博客分类: 编程相关Java相关 javaffmpeg入门
程序员文章站
2024-03-24 11:03:34
...
由于工作需要,研究下视频切割。
现在的情况:视频切割是重中之重,后续项目功能按照这个功能来扩展的。
由于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配置
日志测试
配置配置文件
配置文件config.properties
读取配置文件
测试
第三步:使用ffmpeg获取视频信息
测试结果截图
然后再看一下怎么切割视频
测试结果
之后就是处理多种格式的视频,音频;结合原有项目添加视频切割功能;处理大文件时的考量;配置测试linux环境的视频切割功能等等杂事。
现在的情况:视频切割是重中之重,后续项目功能按照这个功能来扩展的。
由于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环境的视频切割功能等等杂事。