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("转换完了----");
	    } 
}

posted @ 2021-08-27 16:36  紫语  阅读(503)  评论(0编辑  收藏  举报