音视频处理工具FFmpeg与Java结合的简单使用

这篇具有很好参考价值的文章主要介绍了音视频处理工具FFmpeg与Java结合的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是FFmpeg
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用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安装包为例进行演示。解压后的目录结构如下图所示:
音视频处理工具FFmpeg与Java结合的简单使用

以上目录中,我们使用最多的就是bin目录下的ffmpeg.exe文件了,官网给出了一个简单的例子,我们先来看一下:

音视频处理工具FFmpeg与Java结合的简单使用 

转换视频和音频从未如此简单。

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

4.2、视频格式转换

首先我们要来到FFmpeg的解压目录,进入到bin目录中,在此目录中打开cmd工具。如下图所示
音视频处理工具FFmpeg与Java结合的简单使用

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

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

ffmpeg.exe -i test1.mp4 newVideo.avi
具体使用请参考官方文档:ffmpeg Documentation

具体效果如下图所示:
音视频处理工具FFmpeg与Java结合的简单使用

以上是使用命令行进行操作,也可在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<String> 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<String> 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<String> 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的简单使用,如果有更为复杂的需求,直接参考官方文档进行使用即可。文章来源地址https://www.toymoban.com/news/detail-500565.html

到了这里,关于音视频处理工具FFmpeg与Java结合的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • x-cmd-pkg | 音视频处理领域中常用的开源转换工具:ffmpeg

    ffmpeg 是音视频处理领域中常用的开源转换工具。以强大的功能、广泛的格式支持和丰富的参数调节在处理音视频格式的任务中得到了广泛的使用。 FFmpeg 是由 Fabrice Bellard 于 2000 年发起的开源多媒体框架,使用 C 语言编写。 “FF” 代表\\\"fast forward\\\",意为高效处理,而 “mpeg”

    2024年02月04日
    浏览(39)
  • 音视频 FFmpeg音视频处理流程

    推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月12日
    浏览(40)
  • ffmpeg@音视频工具@音视频合并

    FFmpeg中文网 (github.net.cn) FFmpeg 是一款强大的开源跨平台音视频处理工具集,它包含了一系列命令行工具以及用于音频和视频编码解码、格式转换、抓取、流化等功能的库。FFmpeg 支持多种视频、音频格式和编解码器,能够进行音视频的压缩、封装、转码、分割、合并、过滤、抓

    2024年03月17日
    浏览(49)
  • ffmpeg系列学习——FFmpeg的音视频处理

    1.音视频的采样率、采样位深度和声道数 音频和视频的采样率、采样位深度和声道数是媒体文件中的重要参数,它们会直接影响到音视频的质量和文件大小。下面对它们进行详细解释: 采样率 采样率指音频每秒钟采样的次数,用赫兹(Hz)表示。采样率越高,音频的还原度越

    2024年02月04日
    浏览(35)
  • FFmpeg 音视频开发工具

    目录 FFmpeg 下载与安装 ffmpeg 使用快速入门 ffplay 使用快速入门 1、FFmpeg 是处理音频、视频、字幕和相关元数据等多媒体内容的库和工具的集合。一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。 官网:https://www.ffmpeg.org/ 源码:https://github.com/FFmpeg/FFmpeg。

    2024年02月15日
    浏览(37)
  • [音视频处理] FFmpeg使用指北1-视频解码

    本文将详细介绍如何使用ffmpeg 4.4在C++中解码多种格式的媒体文件,这些媒体文件可以是视频、视频流、图片,或是桌面截屏或USB摄像头的实时图片。解码文件后,还将每帧图片转换为OpenCV的Mat格式以供后续使用。 目录 1 基于ffmpeg的媒体文件解码 1.1 简介 1.2 详细代码 2 ffmpeg函

    2024年02月07日
    浏览(46)
  • JavaCV与FFmpeg:音视频流处理技巧

    1. JavaCV简介 JavaCV是一个开源的Java接口,为OpenCV、FFmpeg和其他类似工具提供了封装。它允许Java开发者直接在他们的应用程序中使用这些强大的本地库,而无需深入了解复杂的本地代码。JavaCV特别适用于处理图像和视频数据,提供了一系列的功能,如图像捕获、处理和视频编解

    2024年02月04日
    浏览(35)
  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(53)
  • 音视频开发实战03-FFmpeg命令行工具移植

    作为一个音视频开发者,在日常工作中经常会使用ffmpeg 命令来做很多事比如转码 ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 ,水平翻转视频: ffmpeg -i src.mp4 -vf hflip -acodec copy -vcodec h264 -b 22000000 out.mp4 ,视频截取: ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 ou

    2024年02月16日
    浏览(45)
  • FFmpeg——开源的开源的跨平台音视频处理框架简介

    引言:         FFmpeg是一个开源的跨平台音视频处理框架,可以处理多种音视频格式。它由Fabrice Bellard于2000年创建,最初是一个只包括解码器的项目。后来,很多开发者参与其中,为FFmpeg增加了多种新的功能,例如编码器、过滤器、muxer、demuxer等等,使它成为了一个完整

    2024年03月23日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包