java+ffmpeg使用记录
一、前言
- ffmpeg
完整的跨平台解决方案,用于记录,转换和流传输音频和视频。
FFmpeg是领先的多媒体框架,能够解码,编码, 转码,mux,demux,流,过滤和播放人类和机器创建的几乎所有内容。它支持最模糊的老旧格式,直至最新的格式。无论它们是由某些标准委员会,社区还是公司设计的。它还具有高度的可移植性:FFmpeg可以在各种构建环境,机器体系结构和配置下,跨Linux,Mac OS X,Microsoft Windows,BSD,Solaris等编译,运行并通过我们的测试基础架构 FATE。
- 开发环境
- 操作系统:
Windows 7 Ultimate
- Java 环境:
JDK 1.8
- 参考:
- ffmpeg 官网:http://ffmpeg.org/
- ffmpeg 官方文档:http://ffmpeg.org/documentation.html
- 前辈对 ffmpeg 命令的总结:https://github.com/tonydeng/fmj/blob/master/ffmpeg.md
- ProcessBuilder (java):https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html
二、正文
- 下载并解压 ffmpeg
- 其中 bin 文件夹包含:
ffmpeg.exe
用于转码
ffplay.exe
用于播放
ffprobe.exe
用于查看文件格式
1.命令行运行
-
拷贝视频文件到
bin
文件夹,例如:input.mp4 -
windows 文件夹内
Shift + 鼠标右击
–在此处打开命令窗口(W)
-
运行命令:(格式转换)
> ffmpeg -i input.mp4 output.avi
2.java代码调用
- 创建执行命令的任务工具类
CommandTask.java
package com.demo.ffmpeg;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
/**
* 执行命令的任务工具
* */
public class CommandTask {
/**
* 执行命令
* @param command 命令
* */
public static void exeute(List<String> command) throws IOException {
// 执行命令
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start(); // 开始执行
InputStream errorStream = process.getErrorStream(); // 字节流
InputStreamReader inputStreamReader = new InputStreamReader(errorStream); // 字节流和字符流的中介
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 字符流
String line = "";
while ((line = bufferedReader.readLine()) != null){
System.out.println(line); // 输出转换过程
}
// 关闭流
if(bufferedReader != null){ bufferedReader.close(); }
if(inputStreamReader != null){ inputStreamReader.close(); }
if(errorStream != null){ errorStream.close(); }
}
}
- 创建测试类
FFmpegTest.java
package com.demo.ffmpeg;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
public class FFmpegTest {
public static void main(String[] args) {
String ffmpegPath = "C:\\ffmpeg20200809\\bin\\ffmpeg.exe";
String inputVideoPath = "C:\\ffmpeg20200809\\bin\\input.mp4";
String outputVideoPath = "C:\\ffmpeg20200809\\bin\\output.avi";
// 组装 格式转换 命令
List<String> command = new LinkedList<>();
command.add(ffmpegPath);
command.add("-i");
command.add(inputVideoPath);
command.add(outputVideoPath);
try {
// 执行命令
CommandTask.exeute(command);
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、其它
1.常用参数
参数 | 说明 |
---|---|
-i | 设置输入流 |
-f | 设置输出格式 |
-ss | 开始时间;支持的时间格式:hh:mm:ss[.xxx] |
-t | 持续时间;支持的时间格式:hh:mm:ss[.xxx] |
-title | 设置标题 |
-author | 设置作者 |
-copyright | 设置版权 |
-comment | 设置评论 |
-y | 覆盖输出文件 |
-target | 设置目标文件类型(vcd、svcd、dvd) |
2.视频参数
参数 | 说明 |
---|---|
-b | 设置视频流量,默认 200 k/s |
-s | 设置画面的宽和高 |
-aspect | 设置画面的比例 |
-vn | 不处理视频 |
-vcodec | 设置视频的编码器,默认使用与输入流相同的编解码器 |
3.音频参数
参数 | 说明 |
---|---|
-ar | 设置采样率 |
-ac | 设置声音的通道数 |
-acodec | 使用codec编解码 |
-an | 不处理音频 |
4.常用命令
1)图片
命令 | 说明 |
---|---|
ffmpeg -i input.mp4 -y -f image2 -t 0.001 -s 500*300 output.jpg | 在视频 0.001毫秒处,截取一张 500*300 的 jpg 图片 |
ffmpeg -i input.mp4 -y -f mjpeg -ss 3 -t 0.001 -s 500*300 output.jpg | 在视频 3.003 秒处,截取一张 500*300 的 jpg 图片 |
ffmpeg -i input.mp4 -f image2 -vf fps=1 output%d.png | 每秒钟输出一帧 png 图片 |
ffmpeg -i input.mp4 output%d.png | 每帧输出一张图片 |
ffmpeg -i input.mp4 -t 10 -pix_fmt rgb24 output.gif | 将视频转换为 gif 图片 |
ffmpeg -i input.mp4 -vframes 60 -y -f gif output.gif | 视频前 60 帧转换为一张 gif 图片 |
ffmpeg -f image2 -i output%d.png -r 25 video.mp4 | 将图片转换为视频 |
2)音视频
命令 | 说明 |
---|---|
ffmpeg -i input.mp4 -i input.mp3 -vcodec copy -acodec copy output.mp4 | 将视频文件和音频文件合并 |
ffmpeg -i rtsp://host/address -vcodec copy output.avi | 录制网络视频 |
ffmpeg -i input.mp4 -i logo.gif -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-overlay_h/2" output.mp4 | 添加居中水印;logo.gif为水印图片;overlay 是水印位置 |
ffplay -i input.mp4 -vf hflip | 水平翻转播放视频 |
ffplay -i input.mp4 -vf vflip | 垂直翻转播放视频 |