获取音频的时长

/**
* 获取视频文件的时长
* @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的各种黑科技的更多相关文章

  1. ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

     FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  2. 黑科技项目:英雄无敌III Mod <<Fallen Angel>>介绍

    英雄无敌三简介(Heroes of Might and Magic III) 英3是1999年由New World Computing在Windows平台上开发的回合制策略魔幻游戏,其出版商是3DO. ...

  3. [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”

    NOW, 步 将此黑科技传授予你~ 一.普通家电控制电路板分析 普通家电,其人机接口一般由按键和指示灯组成(高端的会稍微复杂,这里不考虑) 这样交互过程,其实就是:由当前指示灯信息,按照操作流程按相应 ...

  4. C++的黑科技

    周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,"如何产生一个不能被继承的类",这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一 ...

  5. 迪士尼黑科技:爬墙机器人 VertiGo

    12 月 30 日,迪士尼研发出的一款爬墙机器人曝光了一段有趣的视频.从视频里可看出这个机器人碰到墙壁时迅速地作出反应爬了上去. 据了解,这个爬墙机器人名叫 VertiGo,由迪士尼研究中心和苏黎世联 ...

  6. Android黑科技,读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...

  7. localStorage的黑科技-js和css缓存机制

    一.发现黑科技的起因  今天在微信公众号看到一篇技术博文,想用印象笔记收藏,所以发送了文章链接到pc上.然后习惯性地打开控制台,看看源码,想了解下最近微信用了什么新技术.  呵呵,以下勾起了我侦探的欲 ...

  8. iOS 关于UITableView的黑科技

      UITableView是我们最常用的控件了,今天我就来介绍一些关于UITableView的黑科技和一些注意的地方. 1.修改左滑删除按钮的高度   左滑删除这是iOS最先发明的,之后安卓开始模仿. ...

  9. Cnblogs关于嵌入js和css的一些黑科技

    #pong .spoiler{cursor:none;display:inline-block;line-height:1.5;}sup{cursor:help;color:#3BA03B;} Pon ...

随机推荐

  1. MySql的CURRENT_TIMESTAMP

    在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候,该字段默认值为当前时间 ON UPDATE CURRENT_TIMESTAMP表示每次更新这条数据的时候, ...

  2. 【JVM】查看JVM加载的类及类加载器的方法

    查看JVM加载了哪些类 java -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息. java -verbose:class 在程序运行的时候有多少类被加载!你可以用ve ...

  3. 【BZOJ2817】[ZJOI2012]波浪(动态规划)

    [BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...

  4. Yii2 如何输出 sql 语句?

    可以用 $model->find()->createCommand()->getRawSql(); 不能带 all(). find() 它的 返回值类型是 yii\db\Active ...

  5. Android 架构 -- Room

    gradle依赖: // add for room implementation "android.arch.persistence.room:runtime:1.1.1" // ...

  6. P1637 三元上升子序列

    thair 好,这个naive的东西因为只有三元,很好求解.只要把每个数之前小的L[i]与之后大的R[i]求一下即可. 求两次逆序对即可.那么答案便是∑(L[i]*R[i]); 对于更高元的,胡雨菲写 ...

  7. chip

    1.芯片(chip.pas/cpp) [问题描述] 企鹅集成电路公司生产了一种大小为 2×3的芯片.每块芯片是从一块大小为N×M的硅片上切下来的,但由于原材料纯度问题,因而有若干的单位正方形并不能作为 ...

  8. A1141. PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  9. RedHat下安装MySQL5.5

    MYSQL在windows下面安装可能一帆风顺,但是如果真的到纯图形界面的redhat服务器上,可能就不是那么容易了, 这里我就详细的介绍一下MYSQL5.5在linux下的安装以及注意的问题,避免后 ...

  10. textarea高度自适应自动展开

    在使用之前,推荐两个比较好的事件,分别是oninput和onpropertychange,IE9以下不兼容oninput.在textarea发生变化时,可以通过监听这两个事件来触发你需要的功能. te ...