由于项目需求中涉及到视频中音频提取,以及字幕压缩的功能,一直在研究ffmpeg,仅仅两个功能,却深受ffmpeg的折磨。

  今天谈谈ffmpeg在java中的简单使用,首先下载FFmpeg包,官方地址:http://ffmpeg.org/download.html,这里建议下载Linux Static Builds版本的,轻小而且解压后可以直接使用,我使用的版本是ffmpeg-git-20170922-64bit-static.tar.xz。

  解压之后,文件夹中有一个可执行文件ffmpeg,在linux上可以直接运行./ffmpeg -version,可以查看ffmpeg的版本信息,以及configuration配置信息。

  现在,可以使用ffmpeg的相关命令来进行一些操作:

  1.视频中音频提取:ffmpeg -i [videofile]  -vn -acodec copy [audiofile]

  2.字幕压缩至视频中:ffmpeg -i [videofile]  -vf subtitles=[subtitle.srt] [targetvideofile]

  3.其它相关命令可以查阅:http://ffmpeg.org/ffmpeg.html

  说明:

  • videofile是需要提取音频的视频源文件,可以是本地文件,也可以是网络文件url。
  • subtitle.srt是字幕文件(中文字幕即把英文变为中文,其它格式一致),这边就使用最简单的srt标准格式,如下所示:

  

  • 特别注意:srt文件写入的字符编码需要是UTF-8,否则压缩的时候会报无法读取srt文件;
  • 若想压缩中文字幕,需要系统中有中文字体,使用fc-list查询系统支持的字体,fc-list :lang=zh查询支持的中文字体
  • 相关java代码如下:

  

public class FFMpegUtil {

    private static final Logger logger = Logger.getLogger(FFMpegUtil.class);

    // ffmpeg命令所在路径
private static final String FFMPEG_PATH = "/ffmpeg/ffmpeg";
// ffmpeg处理后的临时文件
private static final String TMP_PATH = "/tmp";
// home路径
private static final String HOME_PATH; static {
HOME_PATH = System.getProperty("user.home");
logger.info("static home path : " + HOME_PATH);
} /**
* 视频转音频
* @param videoUrl
*/
public static String videoToAudio(String videoUrl){
String aacFile = "";
try {
aacFile = TMP_PATH + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
+ UUID.randomUUID().toString().replaceAll("-", "") + ".aac";
String command = HOME_PATH + FFMPEG_PATH + " -i "+ videoUrl + " -vn -acodec copy "+ aacFile;
logger.info("video to audio command : " + command);
Process process = Runtime.getRuntime().exec(command);
process.waitFor();
} catch (Exception e) {
logger.error("视频转音频失败,视频地址:"+videoUrl, e);
}
return "";
} /**
* 将字幕烧录至视频中
* @param videoUrl
*/
public static String burnSubtitlesIntoVideo(String videoUrl, File subtitleFile){
String burnedFile = "";
File tmpFile = null;
try {
burnedFile = TMP_PATH + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
+ UUID.randomUUID().toString().replaceAll("-", "") + ".mp4";
String command = HOME_PATH + FFMPEG_PATH + " -i "+ videoUrl + " -vf subtitles="+ subtitleFile +" "+ burnedFile;
logger.info("burn subtitle into video command : " + command);
Process process = Runtime.getRuntime().exec(command);
process.waitFor();
} catch (Exception e) {
logger.error("视频压缩字幕失败,视频地址:"+videoUrl+",字幕地址:"+subtitleUrl, e);
}
return "";
}
}

FFmpeg在JAVA中的使用-音频提取&字幕压缩的更多相关文章

  1. FFmpeg在JAVA中的使用以及Process.waitFor()引发的阻塞问题

    此文已由作者叶海啸授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. FFmpeg是一个开源免费跨平台的视频和音频流方案,可以快速对音视频流进行多方面的处理,本文主要介绍FFmp ...

  2. Java中解析wav音频文件信息:音频声道数,采样频率,采样位数、声音尺寸

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 音频解析方法: public static int toInt(byte[] b) { return ((b[3] << 2 ...

  3. java中的各种流(老师的有道云笔记)

    内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...

  4. 在java中使用FFmpeg处理视频与音频

    FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类. 一.首先,让我们来认识一下FFmpeg在Dos界面的常见操作 1.拷贝视频,并指定新的视频的名字以及格式 ffmpeg ...

  5. Java中的常用方法

    Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同    前缀 startsWith(String s).后缀 endsWit ...

  6. ffmpeg architecture(中)

    ffmpeg architecture(中) 艰苦学习FFmpeg libav 您是否不奇怪有时会发出声音和视觉? 由于FFmpeg作为命令行工具非常有用,可以对媒体文件执行基本任务,因此如何在程序中 ...

  7. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  8. java中Map,List与Set的区别(转)

    Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类 ...

  9. java中注解的使用与实例 (二)

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

随机推荐

  1. Linux (rz、sz命令行)与本地电脑 命令行上传、下载文件

    Linux 与本地电脑直接交互, 命令行上传.下载文件. 一.lrzsz命令行安装: 1.rpm安装:(链接: http://pan.baidu.com/s/1cBuTm2 密码: vijf) rpm ...

  2. C#生成指定长度随机数

    public static string GetRandomString(int iLength) { ";// 随机字符中也可以为汉字(任何) StringBuilder sb = new ...

  3. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  4. DS博客作业03—栈和队列

    1.本周学习总结 本周学习了栈和队列两种数据结构,分别对应后进先出,先进先出两种数据操作 学会栈的特殊类型-共享栈,队列的特殊类型-循环队列的一系列操作 学会熟练使用栈和队列的STL容器,使代码简洁 ...

  5. Mybatis-generator插件,用于自动生成Mapper和POJO

    后台环境为springboot+mybatis. 步骤一:添加mybatis环境 <dependency> <groupId>mysql</groupId> < ...

  6. BZOJ 3940--[Usaco2015 Feb]Censoring(AC自动机)

    3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 723  Solved: 360[Subm ...

  7. 02_python_while循环/格式化输出/逻辑运算

    一. while循环 1.基本形式 while 条件: 循环体 # 判断条件是否为真,如果真,执行代码块.然后再次判断条件是否为真.如果真继续执行代码块...直到条件变成了假.循环退出 ps:死循环 ...

  8. IPv6 Can't assign requested address

    今天试了下 bind IPv6 的地址,报错  Can't assign requested address http://stackoverflow.com/questions/24780404/p ...

  9. Java调用HTTPS接口的证书配置

    首先需要获取到证书文件. 然后,将证书导入到本地: keytool -import -noprompt -trustcacerts -alias <AliasName> -file < ...

  10. eclipse安装STS遇到的问题

    eclipse安装STS时,在eclipse marketplase中搜索STS没有结果,从官网下载STS包,然后安装提示找不到JAR包, 解决方式: eclipse需要和STS包版本一致,如果STS ...