ffmpeg的各种黑科技
获取音频的时长
/**
* 获取视频文件的时长
* @param ffmpegPath 是ffmpeg软件存放的目录,sourceFile是目标文件
* @return
*/
public String duration(String ffmpegPath,String sourceFile){
List<String> duration = new ArrayList<String>();
String ffmpegroot = ffmpegPath+"/ffmpeg";
duration.add(ffmpegroot);
duration.add("-i");
duration.add(sourceFile);
ProcessBuilder pb = new ProcessBuilder();
pb.command(duration);
pb.redirectErrorStream(true);
InputStream is = null;
BufferedReader br = null;
try {
Process p = pb.start();
is = p.getInputStream();
StringBuffer outS = new StringBuffer("");
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line = br.readLine();
while(line!=null){
outS.append(line);
line = br.readLine();
}
String out = outS.toString();
int index = out.indexOf("Duration:");
int end = out.indexOf(",", index);
if(index>=0){
String result = out.substring(index+10, end);
return result;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
br.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
} 音频的原时长:00:00:25.60
获取音频的多少秒(和上面那个方法一块使用)
//参数格式:"00:00:10.68"
public float getTimelen(String timelen){
float min=0.0f;
String strs[] = timelen.split(":");
if (strs[0].compareTo("0") > 0) {
min+=Integer.valueOf(strs[0])*60*60;//秒
}
if(strs[1].compareTo("0")>0){
min+=Integer.valueOf(strs[1])*60;
}
if(strs[2].compareTo("0")>0){
min+=Float.valueOf(strs[2]);
}
return min;
}
截取音频的指定时长
/**
* 截取音频的 从front-duration秒
* @param ffmpegPath ffmpeg程序的路径
* @param sourcePath 源文件
* @param targetPath 需要生成的文件
* @param front 从多少秒开始截取
* @param duration 一共截取多长时间
* @throws Exception
*/
public static void wavCut(String ffmpegPath,String sourcePath, String targetPath,double front,double duration) throws Exception {
List<String> wavToPcm = new ArrayList<String>();
wavToPcm.add(ffmpegPath+"/ffmpeg");
wavToPcm.add("-i");
wavToPcm.add(sourcePath);
wavToPcm.add("-ss");
wavToPcm.add("00:00:0"+front);
wavToPcm.add("-t");
wavToPcm.add(duration+"");
wavToPcm.add("-y");
wavToPcm.add(targetPath);
ProcessBuilder builder = new ProcessBuilder();
builder.command(wavToPcm);
for(String str:wavToPcm){
System.out.print(str+" ");
}
System.out.println();
builder.redirectErrorStream(true);
try {
Process process=builder.start();
int a=process.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch(InterruptedException ie){
ie.printStackTrace();
}
}
tip注意
ffmpeg截取一段视频中一段视频 ffmpeg -i ./plutopr.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 ./cutout1.mp4 -y -ss time_off set the start time offset 设置从视频的哪个时间点开始截取,上文从视频的第10s开始截取
-to 截到视频的哪个时间点结束。上文到视频的第15s结束。截出的视频共5s.
如果用-t 表示截取多长的时间如 上文-to 换位-t则是截取从视频的第10s开始,截取15s时长的视频。即截出来的视频共15s. 注意的地方是:
如果将-ss放在-i ./plutopr.mp4后面则-to的作用就没了,跟-t一样的效果了,变成了截取多长视频。一定要注意-ss的位置。 参数解析
-vcodec copy表示使用跟原视频一样的视频编解码器。
-acodec copy表示使用跟原视频一样的音频编解码器。 -i 表示源视频文件
-y 表示如果输出文件已存在则覆盖。
----------------
音频格式转换 ---转8位
public static void changeWavToRightWav(String ffmpegPath,String sourcePath, String targetPath) throws Exception {
List<String> wavToWav = new ArrayList<String>();
wavToWav.add(ffmpegPath+"/ffmpeg");
wavToWav.add("-i");
wavToWav.add(sourcePath);
wavToWav.add("-ar");
wavToWav.add("8000");
wavToWav.add("-ac");
wavToWav.add("1");
wavToWav.add("-acodec");
wavToWav.add("pcm_alaw");
wavToWav.add("-y");
wavToWav.add(targetPath);
ProcessBuilder builder = new ProcessBuilder();
builder.command(wavToWav);
builder.redirectErrorStream(true);
final Process process=builder.start();
//处理InputStream的线程
new Thread()
{
@Override
public void run()
{
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
try
{
while((line = in.readLine()) != null)
{
System.out.println("output: " + line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}.start();
new Thread()
{
@Override
public void run()
{
BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;
try
{
while((line = err.readLine()) != null)
{
System.out.println("err: " + line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
err.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}.start();
int a=process.waitFor();
}
arm转wav
public static void changeAmrToWav(String ffmpegPath,String sourcePath, String targetPath) throws Exception {
List<String> wavToPcm = new ArrayList<String>();
wavToPcm.add(ffmpegPath+"/ffmpeg");
wavToPcm.add("-y");
wavToPcm.add("-i");
wavToPcm.add(sourcePath);
wavToPcm.add("-acodec");
wavToPcm.add("pcm_alaw");
wavToPcm.add(targetPath);
ProcessBuilder builder = new ProcessBuilder();
builder.command(wavToPcm);
builder.redirectErrorStream(true);
final Process process=builder.start();
//处理InputStream的线程
new Thread()
{
@Override
public void run()
{
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
try
{
while((line = in.readLine()) != null)
{
System.out.println("output: " + line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}.start();
new Thread()
{
@Override
public void run()
{
BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;
try
{
while((line = err.readLine()) != null)
{
System.out.println("err: " + line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
err.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}.start();
int a=process.waitFor();
}
得到amr的时长
/**
* 得到amr的时长
*
* @param file
* @return
* @throws IOException
*/
public static long getAmrDuration(File file) throws IOException {
long duration = -1;
int[] packedSize = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(file, "rw");
long length = file.length();//文件的长度
int pos = 6;//设置初始位置
int frameCount = 0;//初始帧数
int packedPos = -1;
/////////////////////////////////////////////////////
byte[] datas = new byte[1];//初始数据值
while (pos <= length) {
randomAccessFile.seek(pos);
if (randomAccessFile.read(datas, 0, 1) != 1) {
duration = length > 0 ? ((length - 6) / 650) : 0;
break;
}
packedPos = (datas[0] >> 3) & 0x0F;
pos += packedSize[packedPos] + 1;
frameCount++;
}
/////////////////////////////////////////////////////
duration += frameCount * 20;//帧数*20
} finally {
if (randomAccessFile != null) {
randomAccessFile.close();
}
}
return duration; }
获取音频速率
/**
* 功能:获取音频速率
* @param file
* @return
* @throws Exception
*/
public static Integer getWavRate(File file) throws Exception{
FileInputStream fis = new FileInputStream(file);
BufferedInputStream buffer = new BufferedInputStream(fis);
AudioInputStream ain = AudioSystem.getAudioInputStream(buffer);
AudioFormat format=ain.getFormat();
Float frameRate = format.getFrameRate();
return frameRate!=null?frameRate.intValue():0;
}
wav转pcm
public static void changeWavToPcm(String ffmpegPath,String sourcePath, String targetPath) throws Exception {
List<String> wavToPcm = new ArrayList<String>();
wavToPcm.add(ffmpegPath+"/ffmpeg");
wavToPcm.add("-y");
wavToPcm.add("-i");
wavToPcm.add(sourcePath);
wavToPcm.add("-acodec");
wavToPcm.add("pcm_s16le");
wavToPcm.add("-f");
wavToPcm.add("s16le");
wavToPcm.add("-ac");
wavToPcm.add("1");
wavToPcm.add("-ar");
wavToPcm.add("8000");
wavToPcm.add(targetPath);
ProcessBuilder builder = new ProcessBuilder();
builder.command(wavToPcm);
builder.redirectErrorStream(true);
final Process process=builder.start();
//处理InputStream的线程
new Thread()
{
@Override
public void run()
{
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
try
{
while((line = in.readLine()) != null)
{
System.out.println("output: " + line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}.start();
new Thread()
{
@Override
public void run()
{
BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;
try
{
while((line = err.readLine()) != null)
{
System.out.println("err: " + line);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
err.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}.start();
process.waitFor();
}
获取视频的第一秒截图
package com.lzh.utils; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List; /**
*
* @Description: 获取视频的信息
*/
public class FetchVideoCover {
// 视频路径
private String ffmpegEXE; public void getCover(String videoInputPath, String coverOutputPath) throws IOException, InterruptedException {
// ffmpeg.exe -ss 00:00:01 -i spring.mp4 -vframes 1 bb.jpg
List<String> command = new java.util.ArrayList<String>();
command.add(ffmpegEXE); // 指定截取第1秒
command.add("-ss");
command.add("00:00:01"); command.add("-y");
command.add("-i");
command.add(videoInputPath); command.add("-vframes");
command.add("1"); command.add(coverOutputPath); for (String c : command) {
System.out.print(c + " ");
} ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start(); InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader br = new BufferedReader(inputStreamReader); String line = "";
while ( (line = br.readLine()) != null ) {
} if (br != null) {
br.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (errorStream != null) {
errorStream.close();
}
} public String getFfmpegEXE() {
return ffmpegEXE;
} public void setFfmpegEXE(String ffmpegEXE) {
this.ffmpegEXE = ffmpegEXE;
} public FetchVideoCover() {
super();
} public FetchVideoCover(String ffmpegEXE) {
this.ffmpegEXE = ffmpegEXE;
} public static void main(String[] args) {
// 获取视频信息。
FetchVideoCover videoInfo = new FetchVideoCover("c:\\ffmpeg\\bin\\ffmpeg.exe");
try {
videoInfo.getCover("c:\\北京北京.avi","c:\\北京.jpg"); } catch (Exception e) {
e.printStackTrace();
}
}
}
视频和mp3合并
package com.lzh.utils; import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List; public class MergeVideoMp3 { private String ffmpegEXE; public MergeVideoMp3(String ffmpegEXE) {
super();
this.ffmpegEXE = ffmpegEXE;
} public void convertor(String videoInputPath, String mp3InputPath,
double seconds, String videoOutputPath) throws Exception {
// ffmpeg.exe -i 苏州大裤衩.mp4 -i bgm.mp3 -t 7 -y 新的视频.mp4
List<String> command = new ArrayList<>();
command.add(ffmpegEXE); command.add("-i");
command.add(videoInputPath); command.add("-i");
command.add(mp3InputPath); command.add("-t");
command.add(String.valueOf(seconds)); command.add("-y");
command.add(videoOutputPath); for (String c : command) {
System.out.print(c + " ");
} ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start(); InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader br = new BufferedReader(inputStreamReader); String line = "";
while ( (line = br.readLine()) != null ) {
} if (br != null) {
br.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (errorStream != null) {
errorStream.close();
} } public static void main(String[] args) {
MergeVideoMp3 ffmpeg = new MergeVideoMp3("C:\\ffmpeg\\bin\\ffmpeg.exe");
try {
ffmpeg.convertor("C:\\苏州大裤衩.mp4", "C:\\music.mp3", 7.1, "C:\\这是通过java生产的视频.mp4");
} catch (Exception e) {
e.printStackTrace();
}
} }
ffmpeg的各种黑科技的更多相关文章
- ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】
FZU 2105 Digits Count Time Limit:10000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- 黑科技项目:英雄无敌III Mod <<Fallen Angel>>介绍
英雄无敌三简介(Heroes of Might and Magic III) 英3是1999年由New World Computing在Windows平台上开发的回合制策略魔幻游戏,其出版商是3DO. ...
- [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”
NOW, 步 将此黑科技传授予你~ 一.普通家电控制电路板分析 普通家电,其人机接口一般由按键和指示灯组成(高端的会稍微复杂,这里不考虑) 这样交互过程,其实就是:由当前指示灯信息,按照操作流程按相应 ...
- C++的黑科技
周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,"如何产生一个不能被继承的类",这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一 ...
- 迪士尼黑科技:爬墙机器人 VertiGo
12 月 30 日,迪士尼研发出的一款爬墙机器人曝光了一段有趣的视频.从视频里可看出这个机器人碰到墙壁时迅速地作出反应爬了上去. 据了解,这个爬墙机器人名叫 VertiGo,由迪士尼研究中心和苏黎世联 ...
- Android黑科技,读取用户短信+修改系统短信数据库
安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...
- localStorage的黑科技-js和css缓存机制
一.发现黑科技的起因 今天在微信公众号看到一篇技术博文,想用印象笔记收藏,所以发送了文章链接到pc上.然后习惯性地打开控制台,看看源码,想了解下最近微信用了什么新技术. 呵呵,以下勾起了我侦探的欲 ...
- iOS 关于UITableView的黑科技
UITableView是我们最常用的控件了,今天我就来介绍一些关于UITableView的黑科技和一些注意的地方. 1.修改左滑删除按钮的高度 左滑删除这是iOS最先发明的,之后安卓开始模仿. ...
- Cnblogs关于嵌入js和css的一些黑科技
#pong .spoiler{cursor:none;display:inline-block;line-height:1.5;}sup{cursor:help;color:#3BA03B;} Pon ...
随机推荐
- BZOJ4514[Sdoi2016]数字配对——最大费用最大流
题目描述 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci ...
- 第二十一天,pickle json xml shelve configparser模块
今日内容 1.pcikle 专用于python语言的序列化 2.json 是一种跨平台的数据格式 也属于序列化的一种方式 3.xml 可拓展标记语言 一种编写文档的语法 也支持跨平台 比较json而言 ...
- CODEFORCES掉RATING记 #1
时间:2017.7.16晚 比赛:Educational Codeforces Round 25 比赛开始前去睡觉了...开始后5min才起来 一进去就点开AB,B先加载好,就先做了B.读完题后发现是 ...
- bzoj 1257: [CQOI2007]余数之和 (数学+分块)
Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值 其中k mod i表示k除以i的余数. 例如j(5 ...
- BSGS及扩展BSGS总结(BSGS,map)
蒟蒻哪里有什么总结,只能点击%YL% 还有这位ZigZagK大佬的blog \(\mbox{BSGS}\) 模板题:洛谷P3846 [TJOI2007]可爱的质数 给定\(a,b\)和模数\(\mbo ...
- 《App后台开发运维与架构实践》第2章 App后台基础技术
2.1 從App業務邏輯中提煉API接口 業務邏輯思維導圖 功能-業務邏輯思維導圖 基本功能模塊關系 功能模塊接口UML(設計出API) 在設計稿標注API 編寫API文檔 2.2 設計API的要點 ...
- Android客户端与数据库交互数据的简单学习
Ø 数据库整理方案如下: 一.Android+ webservices+SQLServer : 通过webservices客户端向指定服务器发送请求,服务器响应返回指定格式的数据,如json或者x ...
- post提交的数据几种编码格式
1.背景介绍 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端 ...
- ssh-key 与 git账户配置以及多账户配置,以及通信方式从https切换到ssh
参考:http://www.cnblogs.com/dubaokun/p/3550870.html 在使用git的时候,git与远程服务器是一般通过ssh传输的(也支持ftp,https),我们在管理 ...
- Typescript学习笔记(二)枚举
跟随handbook的脚步,详细介绍一下枚举. enum Direction { Up = 1, Down, Left, Right } 一个枚举类型可以包含零个或多个枚举成员,每个枚举成员可以是一个 ...