我是靠谱客的博主 明亮樱桃,这篇文章主要介绍在java中使用FFmpeg处理视频与音频,现在分享给大家,希望可以做个参考。

FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类。

一、首先,让我们来认识一下FFmpeg在Dos界面的常见操作

1.拷贝视频,并指定新的视频的名字以及格式

        ffmpeg.exe -i old.mp4 new.avi

2.将视频和音频结合,并指定视频的长度(7秒),同时生成结合之后的视频文件

        ffmpeg.exe -i tsd.mp4 -i "周笔畅+-+最美的期待.mp3" -t 7 -y new.avi

3.使用ffmpg生成视频截图(对第一秒的画面作为截图)-vframes表示帧数 

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


二、在java中使用FFmpeg

   引入 FFMpegUtil工具类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
 * FFMPEG 的相关操作
 *
 * @author Administrator
 */
public class FFMpegUtil {
//Windows下 ffmpeg.exe的路径
// private static String ffmpegEXE = "D:\Downloads\ffmpeg-20180528-ebf85d3-win64-static\bin\ffmpeg.exe";


//Linux与mac下
ffmpeg的路径

private static String ffmpegEXE = "/developer/ffmpeg-4.0/bin/ffmpeg";
/**

* @param videoInputPath 视频的输入路径

* @param videoOutPath
视频的输出路径

* @throws Exception

*/

// 拷贝视频,并指定新的视频的名字以及格式

// ffmpeg.exe -i old.mp4 new.avi

public static void convetor(String videoInputPath, String videoOutPath) throws Exception {
List<String> command = new ArrayList<String>();
command.add(ffmpegEXE);
command.add("-i");
command.add(videoInputPath);
command.add(videoOutPath);
ProcessBuilder builder = new ProcessBuilder(command);
Process process = null;
try {
process = builder.start();
} catch (IOException e) {
// TODO Auto-generated catch block

e.printStackTrace();
}
// 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理

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();
}
}
/**

* @param videoInputPath 原视频的路径

* @param audioInputPath 音频的路径

* @param videoOutPath
视频与音频结合之后的视频的路径

* @param time
视频的长度 ,单位为 s

* @throws Exception

*/

// 将视频和音频结合,并指定视频的长度,同时生成结合之后的视频文件

// ffmpeg.exe -i tsd.mp4 -i "周笔畅+-+最美的期待.mp3" -t 7 -y new.avi

public static void convetor(String videoInputPath, String audioInputPath, String videoOutPath, double time)
throws Exception {
List<String> command = new ArrayList<String>();
command.add(ffmpegEXE);
command.add("-i");
command.add(videoInputPath);
command.add("-i");
command.add(audioInputPath);
command.add("-t");
command.add(String.valueOf(time));
command.add("-y");
command.add(videoOutPath);
ProcessBuilder builder = new ProcessBuilder(command);
Process process = null;
try {
process = builder.start();
} catch (IOException e) {
// TODO Auto-generated catch block

e.printStackTrace();
}
// 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理

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();
}
}
/**

* @param time_coverimg
视频的第几秒作为封面图

* @param videoInputPath
视频的路径

* @param frame
帧数

* @param coverOutputPath 视频的封面图的路径

* @throws Exception

*/

// ffmpeg.exe -ss 00:00:01 -y -i 视频.mp4 -vframes 1 new.jpg

public static void convetor(String time_coverimg, String videoInputPath, int frame, String coverOutputPath)
throws Exception {
List<String> command = new ArrayList<String>();
command.add(ffmpegEXE);
command.add("-ss");
command.add(time_coverimg);
command.add("-y");
command.add("-i");
command.add(videoInputPath);
command.add("-vframes");
command.add(String.valueOf(frame));
command.add(coverOutputPath);
ProcessBuilder builder = new ProcessBuilder(command);
Process process = null;
try {
process = builder.start();
} catch (IOException e) {
// TODO Auto-generated catch block

e.printStackTrace();
}
// 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理

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) {
//
String videoInputPath = "G:/videos-resources/180525DFH9X09GR4/video/2018052920010792217.mp4";
//
String coverOutputPath = "G:/videos-resources/180525DFH9X09GR4/video/2018052920014289695.jpg";
//
try {
//
convetor("00:00:01", videoInputPath, 1, coverOutputPath);
//
} catch (Exception e) {
//
e.printStackTrace();
//
}
// }

}
==============================================================================================

该工具类其实是通过java来运行Dos界面的命令,有了这个工具类,我们就可以调用该类中的convetor来应对不同的需求,当然,这里只介绍了FFmpeg中的部分功能,如果你想在java中使用FFmpeg的其他功能也很简单,请参考该类,继续重载该类中的convetor方法,将dos界面的命令搬到该类中来运行即可。


最后

以上就是明亮樱桃最近收集整理的关于在java中使用FFmpeg处理视频与音频的全部内容,更多相关在java中使用FFmpeg处理视频与音频内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部