一、什么是FFmpegFFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 -- 引用自百度百科

二、项目组成

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库libavcodec等。

libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;

libavcodec:用于各种类型声音/图像编解码;

libavutil:包含一些公共的工具函数;

libswscale:用于视频场景比例缩放、色彩映射转换;

libpostproc:用于后期效果处理;

ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

ffsever:一个 HTTP 多媒体即时广播串流服务器;

ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

三、FFmpeg使用场景

3.1、以下列举几个开发中常用的功能:ffmpeg在Linux下和windows下的视频采集;

视频格式转换;

视频截图功能;

音视频合成功能;

视频添加水印功能;

3.2、谁在使用:使用FFmpeg作为内核视频播放器:Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音等

使用FFmpeg作为内核的Directshow Filter:ffdshow,lav filters等

使用FFmpeg作为内核的转码工具:ffmpeg,格式工厂等

四、如何使用

4.1、FFmpeg如何下载和安装

FFmpeg可以在Linux、windows以及Mac系统中使用,官网提供了各种系统的安装包,下载安装包请移步FFmpeg官网:FFmpeg

安装包下载完成后,对其进行解压,由于我的开发环境为Windows系统,就已Windows安装包为例进行演示。解压后的目录结构如下图所示:

以上目录中,我们使用最多的就是bin目录下的ffmpeg.exe文件了,官网给出了一个简单的例子,我们先来看一下:转换视频和音频从未如此简单。

图中的命令是Linux下进行操作的,Windows下并无差异,下面我们分别来使用命令行以及Java代码来进行演示视频格式转换、音视频合并以及视频按帧截图功能。

4.2、视频格式转换

首先我们要来到FFmpeg的解压目录,进入到bin目录中,在此目录中打开cmd工具。如下图所示:

注:在地址栏中输入“cmd”,按回车,即可在此目录直接打开cmd工具。此处我准备了一个视频文件以及一个音频文件用于下面功能演示。

在cmd工具中键入以下命令即可完成视频格式的转换:

ffmpeg.exe -i test1.mp4 newVideo.avi

具体效果如下图所示:

以上是使用命令行进行操作,也可在Java中进行操作:

视频格式转换代码:

/*** 简易视频处理 -- (cmd(windows): ffmpeg.exe -i test1.mp4 newVideo.avi)** @param ffmpegPath ffmpeg.exe文件路径,可在rest或者admin中进行配置,使用配置文件进行读取* @param videoInputPath 视频文件路径(输入)* @param videoOutputPath 转换完成的文件路径(输出)* @throws IOException*/

public static void videoConvert(String ffmpegPath, String videoInputPath, String videoOutputPath) throws IOException {

// 构建命令List command = Lists.newArrayList();

command.add(ffmpegPath);

command.add("-i");

command.add(videoInputPath);

command.add(videoOutputPath);

// 执行操作ProcessBuilder builder = new ProcessBuilder(command);

Process process = builder.start();

InputStream errorStream = process.getErrorStream();

InputStreamReader isr = new InputStreamReader(errorStream);

BufferedReader br = new BufferedReader(isr);

String line = "";

while ((line = br.readLine()) != null) {

}

if (br != null) {

br.close();

}

if (isr != null) {

isr.close();

}

if (errorStream != null) {

errorStream.close();

}

}

测试代码:

@Test

public void testVideoConvert() {

FfmpegProperties ffmpegProperties = SpringContextHolder.getBean(FfmpegProperties.class);

try {

FfmpegUtil.videoConvert(ffmpegProperties.getFfmpegFile(), "D:\\tools\\ffmpeg\\bin\\test1.mp4", "D:\\tools\\ffmpeg\\bin\\newVideo.avi");

} catch (IOException e) {

e.printStackTrace();

}

}

由于使用的是SpringBoot,ffmpeg.exe文件路径配置在了appliction.yml中,所以使用了自定义的FfmpegProperties对其进行读取,下述所有例子均使用相同配置,如下所示:

ffmpeg:

ffmpegFile: D:/tools/ffmpeg/bin/ffmpeg.exe #ffmpeg可执行文件路径

outputVideoSuffix: .mp4 #输出视频的后缀名

outputCoverSuffix: .jpg #输出缩略图的后缀名

4.3、音视频合并

音视频合并会使用到两个输入资源,一个音频资源和一个视频资源,此处的例子为一个10s的视频与一个20s的音频,我要达到的效果是视频播放完毕,便退出播放,剩余音频不再进行播放。

ffmpeg.exe -i test2.mp3 -i test1.mp4 -t 10 -y newVideo.mp4

此处:-t代表的是视频的时间,而-y代表覆盖输出文件,直接在cmd工具中执行命令即可

注:在编写命令是,音频文件一定要在视频文件的前面,否则合成出来的视频是有问题的,你会发现音频并没有合成进来。

以上是使用命令行进行操作,也可在Java中进行操作:

/*** 音视频合并,视频结束,音频结束 -- (cmd(windows): ffmpeg.exe -i test2.mp3 -i test1.mp4 -t 10 -y newVideo.mp4)** @param ffmpegPath ffmpeg.exe文件路径,可在rest或者admin中进行配置,使用配置文件进行读取* @param audioInputPath 音频文件路径(输入)* @param videoInputPath 视频文件路径(输入)* @param time 文件时长* @param videoOutputPath 转换完成的文件路径(输出)* @throws IOException*/

public static void audioVideoMerge(String ffmpegPath, String audioInputPath, String videoInputPath, double time, String videoOutputPath) throws IOException {

// 构建命令List command = Lists.newArrayList();

command.add(ffmpegPath);

command.add("-i");

command.add(audioInputPath);

command.add("-i");

command.add(videoInputPath);

command.add("-t");

command.add(String.valueOf(time));

command.add("-y");

command.add(videoOutputPath);

// 执行操作ProcessBuilder builder = new ProcessBuilder(command);

Process process = builder.start();

InputStream errorStream = process.getErrorStream();

InputStreamReader isr = new InputStreamReader(errorStream);

BufferedReader br = new BufferedReader(isr);

String line = "";

while ((line = br.readLine()) != null) {

}

if (br != null) {

br.close();

}

if (isr != null) {

isr.close();

}

if (errorStream != null) {

errorStream.close();

}

}

测试代码:

@Test

public void testAudioVideoMerge() {

FfmpegProperties ffmpegProperties = SpringContextHolder.getBean(FfmpegProperties.class);

try {

FfmpegUtil.audioVideoMerge(ffmpegProperties.getFfmpegFile(), "D:\\tools\\ffmpeg\\bin\\test2.mp3", "D:\\tools\\ffmpeg\\bin\\test1.mp4", 10, "D:\\tools\\ffmpeg\\bin\\newVideo.mp4");

} catch (IOException e) {

e.printStackTrace();

}

}

4.4、视频按帧截图

这个功能没什么好说的,主要用于用户手动截图或者上传视频生成缩略图。

ffmpeg.exe -ss 00:00:01 -y -i test1.mp4 -vframes 1 new.jpg

此处:-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持,-vframes 设置转换多少桢(frame)的视频,此命令是获取第一秒第一帧的截图。

注:生成的截图最好使用jpg格式,占用空间较小,如果需要使用其他格式,根据业务需求自行设置即可。

以上是使用命令行进行操作,也可在Java中进行操作:

/*** 获取第一秒第一帧的缩略图 -- (cmd(windows): ffmpeg.exe -ss 00:00:01 -y -i test1.mp4 -vframes 1 new.jpg)** @param ffmpegPath ffmpeg.exe文件路径,可在rest或者admin中进行配置,使用配置文件进行读取* @param videoInputPath 视频文件路径(输入)* @param coverOutputPath 缩略图输出路径* @throws IOException*/

public static void getVideoCover(String ffmpegPath, String videoInputPath, String coverOutputPath) throws IOException {

// 构建命令List command = Lists.newArrayList();

command.add(ffmpegPath);

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);

// 执行操作ProcessBuilder builder = new ProcessBuilder(command);

Process process = builder.start();

InputStream errorStream = process.getErrorStream();

InputStreamReader isr = new InputStreamReader(errorStream);

BufferedReader br = new BufferedReader(isr);

String line = "";

while ((line = br.readLine()) != null) {

}

if (br != null) {

br.close();

}

if (isr != null) {

isr.close();

}

if (errorStream != null) {

errorStream.close();

}

}

测试代码:

@Test

public void testGetVideoCover() {

FfmpegProperties ffmpegProperties = SpringContextHolder.getBean(FfmpegProperties.class);

try {

FfmpegUtil.getVideoCover(ffmpegProperties.getFfmpegFile(), "D:\\tools\\ffmpeg\\bin\\test1.mp4", "D:\\tools\\ffmpeg\\bin\\new.jpg");

} catch (IOException e) {

e.printStackTrace();

}

}

以上就是FFmpeg的简单使用,如果有更为复杂的需求,直接参考官方文档进行使用即可。

avi和音频合成 ffmpeg_音视频处理工具FFmpeg与Java结合的简单使用相关推荐

  1. 音视频处理工具ffmpeg基本使用

    ffmpeg简介 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. 使用到ffmpeg的公司或工具. 1.互联网用户:Google,Facebook,Youtub ...

  2. 手写一个抖音视频去水印工具,千万别刚一个程序员

    百因必有果 说一下我为什么要做个抖音视频去水印工具,其实是因为我的沙雕女友,她居然刚我~ 有天晚上她在抖音看见一个非常具有 教育意义 的视频,"男人疼媳妇就该承包全部家务活",然后 ...

  3. 可视化音视频分析工具:好用工具大集锦,快转发给你兄弟看看丨音视频工具

    (本文基本逻辑:音画原始数据分析工具介绍 → 编码数据分析工具介绍 → 封装格式分析工具介绍) 工欲善其事,必先利其器.在音视频开发中,为了方便.快捷.直观的分析音视频数据,最好能有一些可视化的分析工 ...

  4. python一键去抖音视频水印工具,请勿用于学习以外的用途!

    一.前言 翻了翻爬虫代码存货,决定把抖音APP视频批量下载的代码拿出来做个文章. 二.实战背景 抖音越来越火,越刷越上瘾,总感觉下一个视频一定会更精彩,根本停不下来.想将抖音里喜欢的小哥哥/×××姐的 ...

  5. 软件分享——Bilibili缓存视频合并软件,m4s音视频合并工具

    bilibili缓存下来的视频,路径android/data/tv.danmaku.bili/download 此目录是bilibili缓存的视频存放目录,是m4s格式的音频和视频文件,不能正常播放. ...

  6. 音视频同步原理[ffmpeg]

    音视频同步原理[ffmpeg] output_example.c 中AV同步的代码如下(我的代码有些修改),这个实现相当简单,不过挺说明问题. 阅读前希望大家先了解一下时间戳的概念. /* compu ...

  7. 音视频学习之ffmpeg常用基础命令整理

    基于windows环境安装好必要的ffmpeg后,对ffmpeg基础命令进行一些了解: 1:ffmpeg查看版本: ffmpeg -version 2:ffmpeg查询命令: 基本信息:ffmpeg ...

  8. android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...

    Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载) 项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码 ...

  9. avi和音频合成 ffmpeg_使用Java和ffmpeg把音频和视频合成视频的操作方法

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

最新文章

  1. Javascript入门视频教程
  2. linux环境下ntp客户端,多种操作系统NTP客户端配置
  3. Document builder customizing
  4. SQL:数据表给定字段的多行记录的合并
  5. 作者:曾琛(1987-),女,就职于中国科学院计算技术研究所。
  6. 针对模拟滚动条插件(jQuery.slimscroll.js)的修改
  7. 【图像融合】图像融合质量评价方法的研究
  8. 机器学习面试-模型融合和提升的算法
  9. knx智能照明控制系统电路图_智能照明控制系统(KNX)讲解
  10. Java动态代理二——CGLIB动态代理应用
  11. Pycharm下了汉化包之后切换回英文界面
  12. 计算机系统新手入门,电脑初学者入门教程
  13. 结构体定义的三种方法总结
  14. 安卓x5webview 加载网页 失败_#PY小贴士# 抓下来的网页为什么没有我要的内容?...
  15. MSF-Evasion模块免杀
  16. airpods有一只耳机冒红光_AirPods单只耳机连接不上、充不上电、闪灯等问题解决方式...
  17. Ps制作的立体字效果
  18. c++内存管理1:primitives
  19. 基于java的毕业设计选题系统的设计与实现
  20. 玩转华为数据中心交换机系列 | 配置动态路由接入M-LAG

热门文章

  1. CAD如何打印图纸啊,一个里面有好几张图纸,如何打印在A4纸上啊
  2. 从设计图到代码的尺寸转换
  3. 辅助机器人符文天赋_LOLS9蒸汽机器人辅助玩法解析_辅布里茨符文出装玩法攻略...
  4. 如何实现以上垂直方向上两个TextView内文字左右对齐
  5. 一本科肄业生的彷徨与迷茫
  6. spring boot项目中处理Schedule定时任务
  7. 从1G到5G,46年屏幕变迁下,富士康、苹果、三星、华为的浴火重生路...
  8. DB2如何创建表空间 如何创建数据库 如何创建缓冲池
  9. WordPress 如何有效拦截和过滤垃圾评论
  10. 微信接口 output {errMsg:translateVoice:fail, the permission value is offline verifying}