迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

使用 Java FFMPEG 将文件从一种格式转换为另一种格式

作者:迹忆客 最近更新:2023/09/28 浏览次数:

FFMPEG 最适合内容创建者或大多数时间与媒体文件交互的人。

今天,我们将探讨如何使用 Java FFMPEG 包装器和 Java 运行时转换媒体文件以从命令行执行 FFMPEG。我们还将探讨一些优先考虑一个优先于另一个的原因。


Fast-forward MPEG (FFMPEG)

Fast-forward MPEG (FFMPEG) 是一个开源和免费的多媒体框架,我们可以使用它来编码、解码、复用、解复用、转码、过滤、流式传输和播放许多已经创建的多媒体文件。

我们可以在 Windows、macOS X、Solaris 和 Linux 上使用 FFMPEG,并使用 FFMPEG 做很多事情。它包括旋转、修剪、裁剪、反转视频、向视频添加过滤器、音频压缩、视频压缩、调整媒体文件大小、淡入/淡出、将视频转换为不同格式等等。

我们可以根据项目的需要使用它们中的任何一个。FFMPEG 在媒体相关软件项目的幕后使用,也被用作许多软件的内部部分,包括 iTunes、Plex、Blender、YouTube、VLC 媒体播放器等。


使用 Java 运行时执行 FFMPEG 将文件从一种格式转换为另一种格式

在这里,我们使用 Java 运行时执行 FFMPEG 来学习各种功能,例如转换、减小文件大小、添加音频、提取音频、修剪媒体文件等。

为此,我们必须在我们的机器上安装 FFMPEG。没有的话可以到它的【官网】下载。

下载并安装后,我们现在可以执行各种命令来练习。其中一些如下:

转换容器格式:

/*
By using this command, we are not converting the video
into different codecs but changing the container format
to contain the same video as the input file.
*/
ffmpeg -i input.mkv output1.mp4

转换视频和音频编解码器:

/*
This command converts the input video file into
`vp9` codec and the audio contained in that container
into the `vorbis ogg` format.
*/
ffmpeg -i input.mkv -c:v vp9 -c:a libvorbis output2.webm

仅转换视频编解码器:

/*
This command converts the video codec to `vp9` and keeps
the audio codec as it is.
*/
ffmpeg -i input.mkv -c:v vp9 -c:a copy output3.webm

仅转换音频编解码器:

/*
Here, we convert the audio codec to `libvorbis`
and keep the video codec as it is.
*/
ffmpeg -i input.mkv -c:v copy -c:a libvorbis output4.mkv

降低比特率:

/*
This command keeps the audio codec as it is, converts
the video codec to `libx264` by reducing the bitrate to `1M`.
*/
ffmpeg -i input.mkv -c:a copy -c:v libx264 -b:v 1M output5.mp4

降低帧速率以减小文件大小:

/*
This command keeps the audio codec as it is, converts the video
the codec to `libx264` and reduce the fps to 24.
*/
ffmpeg -i input.mkv -c:a copy -c:v libx264 -r 24 output6.mp4

降低分辨率:

/*
This command keeps the audio codec as it is, converts the video
the codec to `libx264` reduces the resolution to `848x480`.
*/
ffmpeg -i input.mkv -c:a copy -c:v libx264 -s 848x480 output.mp4

降低比特率、分辨率和帧率:

/*
This command keeps the audio codec as it is, converts the video
the codec to `libx264`, reduce the resolution to `848x480`, and bitrate for the video to `1M`, and change fps to 30.
*/
ffmpeg -i input.mkv -c:a copy -c:v libx264 -b:v 1M -r 30 -s 848x480 output.mp4

修剪视频文件:

/*
This command trims the video length to 10 seconds, starting
from the given beginning point.
*/
ffmpeg -i input.mkv -ss 00:00:10 -t 10 output.mkv

提取音频:

//it extracts the audio from a video file
ffmpeg -i input.mkv -vn output.m4a

改变音频的速度:

//it speeds up the audio
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

改变视频的速度:

//it changes the speed of the video
ffmpeg -i input.mkv -filter:v "setpts=0.125*PTS" output.mp4

以下是我们在上述 ffmpeg 命令中使用的每个标志的描述。

旗帜 描述
ffmpeg 我们正在使用的命令名称。
-i 输入文件后跟输入文件的路径。在我们的例子中,我们在同一个目录中有输入文件。所以,我们只是把它的名字写成 input.mkv
-c:v 视频文件的编解码器。
-c:a 音频文件的编解码器。
copy 根据使用情况保留编解码器。如果用作 -c:v copy,它将保持视频文件的编解码器相同;另一方面,如果我们将它用作 -c:a copy,它将保持音轨原样。
-b:v 视频文件的比特率。
1M 执行命令后我们希望获得的给定比特率。
-r 帧率 (fps) 后跟帧率数。
-s 尺寸开关后跟新尺寸 848x480
-ss 开始时间戳,而 -t 指定剪辑的实际持续时间(以秒为单位)。
-vn 没有视频。它只从输入文件中提取音频。
atempo 用于减慢或加快音频的速度。
-filter:a / -filter:v 分别过滤音频和视频。
setpts 设置演示时间戳。
vp9 / libx264 视频文件的编解码器。
libvorbis 音频文件的编解码器。

使用 FFMPEG 的 Java 包装器

在这里,我们使用以下工具:

  1. Java 18.0.1.1
  2. MongoDB 5.0.8
  3. NetBeans IDE 13
  4. Maven 来安装依赖项

示例代码:

//replace the package with your own if you have
package com.voidtesting.ffmpeg_java_wrapper;

//import necessary libraries
import java.io.File;
import java.io.IOException;

//FFMPEG_Java_Wrapper class
public class FFMPEG_Java_Wrapper {

    //main
    public static void main(String[] args) {

        //try block
        try {
            //create process
            Runtime rt = Runtime.getRuntime();
            //save the location
            File folder = new File("C:\\Users\\DelftStack\\Desktop\\MediaFiles");
            //save all files in an array that are retrieved from the specified folder
            File[] file = folder.listFiles();

            /*
            for each filename, open the command prompt
            and execute the specified command.
             */
            for (int i = 0; i < file.length; i++) {
                rt.exec("cmd.exe /c start "
                        + "ffmpeg -i " + file[i].getName()
                        + " -vn output" + (i + 1) + ".m4a", null,
                        folder);
            }//end for

        } //end try
        catch (IOException e) {
            System.out.println(e);
        }//end catch

    }//end main
}//end FFMPEG_Java_Wrapper

此代码将遍历指定目录中的所有视频文件,从中提取音频,并将它们保存在当前目录中。要执行此代码,我们必须每次都打开 IDE 并运行代码。

如果我们只执行一次代码并制作一个 .jar 文件以供将来使用会怎样?为此,我们在 pom.xml 文件中添加以下代码。

示例代码:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>
                               <!--make sure to replace the name
                                   of your Main file here-->
                               com.voidtesting.ffmpeg_java_wrapper
                                .FFMPEG_Java_Wrapper
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

执行代码后,该特定项目的所有 .jar 文件将保存在 Maven 的默认目录中,即 C:\Users\AdministratorName\.m2\repository

由于我们将文件保存在 com.voidtesting.ffmpeg_java_wrapper 包中,我们的 .jar 文件将位于以下路径:

C:\Users\Dell\\.m2\repository\com\voidtesting\ffmpeg_java_wrapper\FFMPEG_Java_Wrapper\1.0-SNAPSHOT

确保选择看起来像 yourFileName-1.0-SNAPSHOT-jar-with-dependencies 的文件。我们可以将该文件放在机器上的任何位置并按如下方式执行它:

java -jar FFMPEG_Java_Wrapper-1.0-SNAPSHOT-jar-with-dependencies.jar

优先考虑 Java 运行时执行 FFMPEG 而不是 Java FFMPEG Wrapper 或反之亦然的原因

这是一个固执己见的观点,因人而异,但有一个非常明确的答案。

如果我们想以编程方式使用 FFMPEG 并解决 Java 应用程序中的问题,我们会选择 Java FFMPEG 包装器。在这里,我们可以根据我们的需求定义我们的逻辑,或者使用已经编写好的 API 来完成我们的任务。

通过使用 API,我们可以实现编译时安全、调用内置方法等等。如果我们不想弄乱 API 并寻找简单的解决方案,那么 CLI 选项是首选。

在这里,我们手动键入命令来完成任务。试想一下,如果我们每天必须为一个复杂的项目输入数千条命令?

长话短说,CLI 仅适用于简单的项目,但 Java Wrapper 可用于自动化事物并有利于复杂的项目。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Java 中简化或减少分数

发布时间:2023/09/28 浏览次数:186 分类:Java

在数学中,分数是表示为商的数字。它以 a/b 形式表示,其中 a 是被除数(分子),b 是除数(分母)。在数学中,分数代表整体的一部分或一部分。它有分子和分母两部分,其中分子是被除数

在 Java 中计算两点之间的距离

发布时间:2023/09/28 浏览次数:84 分类:Java

使用勾股定理,我们可以在 Java 中找到两点之间的距离。本文介绍如何在 Java 中计算两点之间的距离。

在 Java 中计算欧几里得距离

发布时间:2023/09/28 浏览次数:80 分类:Java

本文将帮助你使用 Java 计算两点之间的距离。在本文中,我们将研究两点之间距离的计算。在 Java 中计算欧几里得距离

在 Java 中计算数学表达式

发布时间:2023/09/28 浏览次数:146 分类:Java

在 Java 编程语言中,你可以使用堆栈计算算术表达式。堆栈是一种适用于先进后出(FILO) 或后进先出(LIFO) 的数据结构机制,我们将使用它来评估算术表达式。

在 Java 中跳出 for 循环

发布时间:2023/09/28 浏览次数:112 分类:Java

本文将教我们如何跳出 Java 中的 for 循环。在编程中,某些条件需要中断 for 循环或任何其他与此相关的循环。让我们来看看。

Java 中的 JFileChooser 示例

发布时间:2023/09/22 浏览次数:67 分类:Java

本文展示了 Java 中的 jfilechooser 示例。JFileChooser 为我们提供了一个窗口或提示,我们可以使用它来选择文件或文件夹。它是 Swing 包的一部分。

在 Java 中使用 setFont

发布时间:2023/09/22 浏览次数:96 分类:Java

本文介绍了在 Java 中使用 setFont 方法的方法。在本文中,我们将学习如何使用从 javax.swing.JFrame 类中的 java.awt.Container 继承的 setFont() 方法。

在 Swing 中将 JLabel 居中

发布时间:2023/09/22 浏览次数:145 分类:Java

本文介绍了如何在 Java Swing 中使 JLabel 居中。本文介绍了如何在 Java Swing 中使 JLabel 居中。在 Swing 中将 JLabel 居中

在 Java Swing 中更改 JLabel 文本

发布时间:2023/09/22 浏览次数:133 分类:Java

本文介绍了如何在 Java swing 中更改 JLabel 文本。本文介绍了如何在 Java swing 中更改 JLabel 文本。在 Java Swing 中更改 JLabel 文本

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便