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 ...
随机推荐
- BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流
题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...
- 抓包工具Fiddler的使用说明
软件介绍 Fiddler是一个C#实现的浏览器抓包和调试工具,fiddler启用后作为一个proxy存在于浏览器和服务器之间,从中监测浏览器与服务器之间的http/https级别的网络交互.目前可以支 ...
- [洛谷P4147] 玉蟾宫
类型:单调栈 传送门:>Here< 题意:求一个$01$矩阵中最大子矩形(全是$1$)的面积 解题思路 单调栈的一个经典应用 考虑维护一个数组$p[i][j]$表示$(i,j)$往上最多有 ...
- 用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)
汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放 ...
- Git回滚代码暴力法
Git回滚有多种方式,这里使用的是[强制提交到远程分支] 效果为:如回滚前的提交记录是 1.2.3.4,使用这种方法回滚到2,那么提交记录就变成了1.2. 操作方法: 需要在本地的Git仓库,右键选择 ...
- C#常用的命名规则汇总
C#常用的命名规则汇总 来源 https://www.cnblogs.com/pengyouqiang88/p/5021128.html 本文转载自脚本之家 本文详细汇总了C#常用的命名规则.分享给大 ...
- 【 HDU 2177 】取(2堆)石子游戏 (威佐夫博弈)
BUPT2017 wintertraining(15) #5C hdu2177 题意 两个人轮流取石子,可以取一堆的任意非负整数个或两堆取相同个,先取完的输. 给定若干组数据:a,b表示两堆的石子数量 ...
- HNOI2019 游记
HNOI2019 游记 Day 0 其实考前几天,心里还是挺慌的.结果最后 Day 0 的时候,因为种种原因反而释然了.也许是觉得,在这一步退役,也没有什么好害怕的吧. OI 本身就是一项偶然性太大的 ...
- 一种使用 emwin 绘制图片的方法
@2018-12-10 [小记] 使用官方 <GUIBuilder.exe> 软件里的 Image 控件,注意格式为 .bmp,这种方式是将图片数据直接转为十六进制数据存储至静态区 具体使 ...
- Java复习总结——详细理解Java反射机制
反射是什么 反射的作用用一句简单的话来讲就是可以对代码进行操作的代码,这个特性经常在被用于创建JavaBean中,通常造轮子的人会用到这个特性,而应用程序员用到这个特性的场景则较少. 能够分析类能力的 ...