ffmpeg实现高清视频之间的相互转换
ffmpeg 是当下系统最流行的音视频处理库,功能强大,并且提供了丰富的终端命令,转换及其简单,实是日常视频处理的一大利器!
它还可以实现视频水印等各类功能实现
视频水印示例:[ 视频加文本水印、图片水印、多行文本水印 也已经整理好,后续有时间再更一版 ]
- ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:10 [out]" outputvideo.flv // Top left corner
- ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:10 [out]" outputvideo.flv // Top right corner
- ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:main_h-overlay_h-10 [out]" outputvideo.flv // Bottom left corner
- ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]" outputvideo.flv // Bottom right corner
**话不多说,上视频互转代码,当前版本为windows下代码, linux需要调整ffmpeg目录:特殊格式注意使用mencoder **
package com.ziyu.project.util;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConvertVideo {
private static HashMap<String, String> fileType;
public static Logger logger = LoggerFactory.getLogger(ConvertVideo.class);
public static String projectPath = D:\\tool\\ffmpeg\\bin; //ffmpeg 包安装bin目录
static
{
fileType = new HashMap<String, String>();
fileType.put("avi", "true");
fileType.put("mpg", "true");
fileType.put("wmv", "true");
fileType.put("3gp", "true");
fileType.put("mov", "true");
fileType.put("mp4", "true");
fileType.put("asf", "true");
fileType.put("asx", "true");
fileType.put("flv", "true");
fileType.put("rmvb", "true");
fileType.put("rm", "true");
fileType.put("wmv9", "true");
fileType.put("mp3", "true");
fileType.put("ape", "true");
fileType.put("wma", "true");
fileType.put("wav", "true");
fileType.put("mid", "true");
} //定义检测文件类型
public static boolean mencoderConvertToFLV(String inputFile, String outputFile)
{
if (checkContentType(inputFile))
{
if (new File(inputFile).isFile())
{
try
{
String cmd = projectPath+"/mencoder "+ inputFile +" -o "+outputFile + " -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050";
logger.debug("cmd-------->>>"+cmd);
Runtime.getRuntime().exec(cmd);
return true;
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
}
return false;
}
return false;
}
public static boolean checkContentType(String inputFile)
{
String type = inputFile.substring(inputFile.lastIndexOf(".") + 1, inputFile.length()).toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
return "true".equals(fileType.get(type));
}
public static boolean process(String inputFile, String outputFile)
{
if (new File(inputFile).isFile())
{
try
{
String cmd = projectPath+"/ffmpeg -i "+inputFile+" -y -b 1000000 -b:v 3000k "+outputFile;// -b:v 3000k 码率调整,数字越高清晰度越高
Runtime.getRuntime().exec(cmd);
return true;
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
}
return false;
}
/**
* 特殊类型转换 需装mencoder 插件,暂时不用此方法
* @param projectPath
* @param inputFile
* @param outputFile
* @param suffix
* @return
*/
public static boolean convertToFLV( String inputFile, String outputFile , String suffix)
{
if( suffix.equalsIgnoreCase(".rmvb") || suffix.equalsIgnoreCase(".rm") || suffix.equalsIgnoreCase(".wmv9") || suffix.equalsIgnoreCase(".avi") ){
if(ConvertVideo.mencoderConvertToFLV( inputFile, outputFile)){
logger.debug("转换成功----");
return true;
}else{
logger.debug("未成功转换----");
return false;
}
}else{
if(ConvertVideo.ffmpegConvert(inputFile, outputFile)){
logger.debug("转换成功----");
return true;
}else{
logger.debug("未成功转换----");
return false;
}
}
}
/**
* 音视频转换 2021年8月13日10:50:01
* @param fromPath 原文件
* @param toPath 转化后文件
* @author ziyu
* @return
*/
public static boolean ffmpegConvert(String fromPath, String toPath)
{
boolean a=true;
if (checkContentType(fromPath))
a = process(fromPath, toPath);
return a;
}
public static void main(String[] args)
{
if(ConvertVideo.ffmpegConvert("F:/Test_ziyu/temp.flv", "F:/Test_ziyu/temp20210816_01.mp4")){
logger.debug("转换成功----");//使用ffmepg转换 ,但是ffmepg不支持转化rmvb/ rm/ wmv9 格式 其他的格式请用mencoderConvertToFLV(使用menucoder转换)
}else{
logger.debug("未成功转换----");
}
logger.debug("转换完了----");
}
}