本文共 3799 字,大约阅读时间需要 12 分钟。
完整的跨平台解决方案,用于记录,转换和流传输音频和视频。
FFmpeg是领先的多媒体框架,能够解码,编码, 转码,mux,demux,流,过滤和播放人类和机器创建的几乎所有内容。它支持最模糊的老旧格式,直至最新的格式。无论它们是由某些标准委员会,社区还是公司设计的。它还具有高度的可移植性:FFmpeg可以在各种构建环境,机器体系结构和配置下,跨Linux,Mac OS X,Microsoft Windows,BSD,Solaris等编译,运行并通过我们的测试基础架构 。
- 操作系统:
Windows 7 Ultimate
- Java 环境:
JDK 1.8
- ffmpeg 官网:
- ffmpeg 官方文档:
- 前辈对 ffmpeg 命令的总结:
- ProcessBuilder (java):
资源下载:
ffmpeg.exe
用于转码说明文档:
ffplay.exe
用于播放说明文档:
ffprobe.exe
用于查看文件格式说明文档:
拷贝视频文件到 bin
文件夹,例如:input.mp4
windows 文件夹内 Shift + 鼠标右击
– 在此处打开命令窗口(W)
运行命令:(格式转换)
> ffmpeg -i input.mp4 output.avi
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(Listcommand) 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"; // 组装 格式转换 命令 Listcommand = new LinkedList<>(); command.add(ffmpegPath); command.add("-i"); command.add(inputVideoPath); command.add(outputVideoPath); try { // 执行命令 CommandTask.exeute(command); } catch (IOException e) { e.printStackTrace(); } }}
参数 | 说明 |
---|---|
-i | 设置输入流 |
-f | 设置输出格式 |
-ss | 开始时间;支持的时间格式:hh:mm:ss[.xxx] |
-t | 持续时间;支持的时间格式:hh:mm:ss[.xxx] |
-title | 设置标题 |
-author | 设置作者 |
-copyright | 设置版权 |
-comment | 设置评论 |
-y | 覆盖输出文件 |
-target | 设置目标文件类型(vcd、svcd、dvd) |
参数 | 说明 |
---|---|
-b | 设置视频流量,默认 200 k/s |
-s | 设置画面的宽和高 |
-aspect | 设置画面的比例 |
-vn | 不处理视频 |
-vcodec | 设置视频的编码器,默认使用与输入流相同的编解码器 |
参数 | 说明 |
---|---|
-ar | 设置采样率 |
-ac | 设置声音的通道数 |
-acodec | 使用codec编解码 |
-an | 不处理音频 |
命令 | 说明 |
---|---|
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 | 将图片转换为视频 |
命令 | 说明 |
---|---|
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 | 垂直翻转播放视频 |
转载地址:http://dznws.baihongyu.com/