获取音频的时长

/*** 获取视频文件的时长* @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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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.jpgList<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();}}
}

View Code

视频和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 新的视频.mp4List<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();}}}

View Code

转载于:https://www.cnblogs.com/coder-lzh/p/9550263.html

ffmpeg的各种黑科技相关推荐

  1. android 反编译_Box 黑科技——支持手机端反编译

    项目地址: https://github.com/lulululbj/Box 文末扫码获取最新安装包 . 前言 有将近一个月没有更新文章了,一方面在啃 AOSP ,消化起来确实比较慢.在阅读的过程中, ...

  2. 【云周刊】第146期:史上最大规模人机协同的双11,12位技术大V揭秘背后黑科技...

    摘要: 史上最大规模人机协同的双11,12位技术大V揭秘背后黑科技,INTERSPEECH 2017系列 | 语音识别之语言模型技术,机器学习初学者必须知道的十大算法,云数据库SQL Server 2 ...

  3. 黑科技:绕过眼睛植入幻觉,科学家成功在盲人脑海中呈现指定图像!

    来源 | 学术头条(ID:SciTouTiao) 头图 | CSDN付费下载自视觉中国 对于全球 5000 多万盲人来说,重见光明是一个遥不可及的梦想.而为了与盲人朋友进行交互,我们发明了盲文,用各种 ...

  4. 黑科技抗疫,Python开发者大集结!

    2020年初,突如其来的新型冠状病毒肺炎打乱了所有人的节奏,但社会各界迅速团结起来,为抗击疫情贡献出自己的力量.除了捐款捐物外,很多科技公司运用5G.大数据.AI.云计算等新互联网技术,以科技的手段助 ...

  5. 围巾都这么黑科技了,是我见识少了

    有一个永恒的话题: 北方冷一点还是南方冷一点? 答案是:哪里都冷! 冬天最痛苦的莫过于走出空调房-- 刺骨的风直直的从领口处灌进去 那叫一个"透心凉,心飞扬" 缠了好几圈的大围巾却 ...

  6. 帮奶牛找对象?华为云AI黑科技大揭秘

    AI可以用来做什么? 华为云BU总裁郑叶表示,"AI不是一个独立的产品,而是一种 '基本生产力',适用于大部分经济活动,将改变每一个行业.企业和职业,产生倍增效应." 于是,华为的 ...

  7. 阿里云首席科学家闵万里:我们为什么敢挑战一百年的制度,因为黑科技能为挽救生命抢来50%的可能性

    如果急救车不被困在红灯下绝望等待,里面垂危的生命,或者还有希望.也许AI可以做到,让绿灯提前为他敞开生命之路. 编辑 | 鸽子 在这世界上,最令人绝望的等待就是在急救车上,无情的红色信号灯将它一路拦截 ...

  8. 独家 | 我们扒出了这家中国创业公司,竟比苹果iPhone X早两年推出黑科技,还不用借助深度摄像头

    关心AI的人们都关注了此号☝☝☝ 于是,没有iPhone X,我也可以在我仅2000元的安卓机上玩转黑科技了. 记者:鸽子 在我威威天朝,表情包早已泛滥在各类社交应用程序中,如今,咱可以玩点新的包了. ...

  9. 一边动,一边画,自己就变二次元!华人小哥参与的黑科技:实时交互式视频风格化...

    来源:量子位 本文约1601字,建议阅读5分钟. 本文介绍来自布拉格捷克理工大学和Snap研究所的黑科技--只需要2个特定的帧,就能实时变换视频中对象的颜色.风格甚至是样式. 动画,动画,就是你动你的 ...

最新文章

  1. arial字体可以商用吗_每次做PPT都不知该怎么选字体?6种万能字体搭配组合送你...
  2. presto-server-0.198集群安装
  3. quartzjob传递传输_Quartz教程三:Job与JobDetail介绍
  4. 中点和中值滤波的区别_频谱仪和EMI测试接收机什么区别?安泰维修中心分享
  5. seekbar垂直放置_将刻度线对准Android SeekBar
  6. 学习mfc的一些方法
  7. windows桌面待办事项_想拒绝拖延症?你还缺一款云同步提醒的的桌面便签软件!...
  8. 《神经网络和深度学习》系列文章七:实现我们的神经网络来分类数字(上)...
  9. 先装ubuntu后装windows时遇到的问题的解决办法
  10. 基于PHP实现高性能敏感词过滤算法
  11. 问卷与量表数据分析(SPSS+AMOS)学习笔记(一) :问卷分析的流程
  12. 烤仔观察丨和你息息相关!DCEP 能否领跑?各国数字货币都在搞什么?
  13. 决策树算法--ID3算法
  14. qt使用鼠标事件获取鼠标在QLabel和Ui界面中的点击位置
  15. 合肥php怎么这么多的,合肥为什么那么多“郢”?答案就在这!
  16. ios 微信登录sdk集成
  17. php cms下载地址,下载phpcms详细步骤
  18. PHP开发微信支付小微商户V3版本 图片上传、生成签名、平台证书获取、平台证书编号、敏感信息加密
  19. Kubernetes 国外镜像的网络问题
  20. 一名学生A希望访问网站www.google.com。学生A在其浏览器中输入http://www.google.com并按回车.....

热门文章

  1. 程序员的键盘 ikbc poker3 使用心得
  2. 向量组是否相关与行列式,方程组,秩的联系。
  3. nyoj 1273 宣传墙
  4. Chrome浏览器访问站点浏览器提示不安全解决方案
  5. Google服务器架构图解简析
  6. Ae/Pr/FCPX抠图插件:Primatte Keyer Mac大大提高工作效率
  7. java log 2 n_log2n
  8. 导入导出excel表格EasyExcel操作
  9. macOS软件历史版本下载
  10. CPU 发热的几个可能原因