java
1 package com.zhwy.util; 2 3 import java.io.File; 4 import java.util.ArrayList; 5 import java.util.Calendar; 6 import java.util.List; 7 /** 8 * 視頻轉碼_截圖 9 */ 10 public class VideoToPicUtil { 11 12 public static void main(String[] args) { 13 String videoPathURL = "D:/ffmpeg_mencoder_File/sourceVideos/短視頻.mp4";//源視頻文件路徑 14 VideoToPic(videoPathURL); 15 } 16 /** 17 * 視頻截圖工具 18 * @param videoPath 源視頻文件路徑 19 * @return 20 */ 21 public static String VideoToPic(String videoPath){ 22 if (!is_File(videoPath)) { //判斷路徑是否是一個文件 23 System.out.println(videoPath + " is not file"); 24 } 25 String VideoToPicResult=executeCodecs(videoPath); 26 return VideoToPicResult; 27 } 28 29 /** 30 * 判斷路徑是否是一個文件 31 * 32 * @param file 33 * 源視頻文件路徑 34 */ 35 private static boolean is_File(String path) { 36 File file = new File(path); 37 if (!file.isFile()) { 38 return false; 39 } 40 return true; 41 } 42 43 /** 44 * 判斷視頻格式 45 */ 46 private static int is_VideoType(String srcFilePath) { 47 String type = srcFilePath.substring(srcFilePath.lastIndexOf(".") + 1, srcFilePath.length()).toLowerCase(); 48 // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) 49 if (type.equals("avi")) { 50 return 0; 51 } else if (type.equals("mpg")) { 52 return 0; 53 } else if (type.equals("wmv")) { 54 return 0; 55 } else if (type.equals("3gp")) { 56 return 0; 57 } else if (type.equals("mov")) { 58 return 0; 59 } else if (type.equals("mp4")) { 60 return 0; 61 } else if (type.equals("asf")) { 62 return 0; 63 } else if (type.equals("asx")) { 64 return 0; 65 } else if (type.equals("flv")) { 66 return 0; 67 } 68 // 對ffmpeg.exe沒法解析的文件格式(wmv9,rm,rmvb等),能夠先用別的工具(mencoder.exe)轉換爲.avi(ffmpeg能解析的格式). 69 else if (type.equals("wmv9")) { 70 return 1; 71 } else if (type.equals("rm")) { 72 return 1; 73 } else if (type.equals("rmvb")) { 74 return 1; 75 } 76 return 9; 77 } 78 /** 79 * 源視頻轉換成AVI格式 80 * 81 * @param type 82 * 視頻格式 83 */ 84 // 對ffmpeg.exe沒法解析的文件格式(wmv9,rm,rmvb等), 能夠先用別的工具(mencoder.exe)轉換爲avi(ffmpeg能解析的)格式. 85 private static String convertToAVI(int type,String srcFilePath) { 86 String mencoderPath = "D:\\ffmpeg_mencoder_File\\Tools\\mencoder.exe"; // 轉換工具路徑 87 String fileNameWithoutSuffix=getFileNameWithoutSuffix(srcFilePath); 88 String codcFilePath ="D:\\ffmpeg_mencoder_File\\targetVideos\\"+fileNameWithoutSuffix+".avi";//【存放轉碼後視頻的路徑,記住必定是.avi後綴的文件名】 89 List<String> commend = new ArrayList<String>(); 90 commend.add(mencoderPath); 91 commend.add(srcFilePath); 92 commend.add("-oac"); 93 commend.add("lavc"); 94 commend.add("-lavcopts"); 95 commend.add("acodec=mp3:abitrate=64"); 96 commend.add("-ovc"); 97 commend.add("xvid"); 98 commend.add("-xvidencopts"); 99 commend.add("bitrate=600"); 100 commend.add("-of"); 101 commend.add("avi"); 102 commend.add("-o"); 103 commend.add(codcFilePath); 104 try { 105 //調用線程命令啓動轉碼 106 ProcessBuilder builder = new ProcessBuilder(); 107 builder.command(commend); 108 builder.start(); 109 return codcFilePath; 110 } catch (Exception e) { 111 e.printStackTrace(); 112 return null; 113 } 114 } 115 116 /** 117 * 源視頻轉換成FLV格式 118 * @param srcFilePathParam 119 * 源:用於指定要轉換格式的文件,要截圖的源視頻文件路徑 120 */ 121 // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) 122 private static String convertToFLV(String srcFilePathParam) { 123 if (!is_File(srcFilePathParam)) { 124 System.out.println(srcFilePathParam + " is not file"); 125 } 126 // 文件命名 127 String fileNameWithoutSuffix=getFileNameWithoutSuffix(srcFilePathParam); 128 String codcFilePath ="D:\\ffmpeg_mencoder_File\\targetVideos\\"+fileNameWithoutSuffix+".flv";//【存放轉碼後視頻的路徑,記住必定是.flv後綴的文件名】 129 String mediaPicPath ="d:\\ffmpeg_mencoder_File\\cutPicture\\"+ fileNameWithoutSuffix+".jpg"; 130 System.out.println("fileNameWithoutSuffix:"+fileNameWithoutSuffix); 131 Calendar c = Calendar.getInstance(); 132 String savename = String.valueOf(c.getTimeInMillis())+ Math.round(Math.random() * 100000); 133 String ffmpegPath = "D:\\ffmpeg_mencoder_File\\Tools\\ffmpeg.exe"; 134 List<String> commend = new ArrayList<String>(); 135 commend.add(ffmpegPath); 136 commend.add("-i"); 137 commend.add(srcFilePathParam); 138 commend.add("-ab"); 139 commend.add("56"); 140 commend.add("-ar"); 141 commend.add("22050"); 142 commend.add("-qscale"); 143 commend.add("8"); 144 commend.add("-r"); 145 commend.add("15"); 146 commend.add("-s"); 147 commend.add("600x500"); 148 commend.add(codcFilePath); 149 String cutPicPath =null; 150 try { 151 Runtime runtime = Runtime.getRuntime(); 152 Process proce = null; 153 cutPicPath = " D:\\ffmpeg_mencoder_File\\Tools\\ffmpeg.exe -i " 154 + srcFilePathParam 155 + " -y -f image2 -ss 2 -t 0.001 -s 600x500 "+ mediaPicPath; //截圖文件的保存路徑 156 proce = runtime.exec(cutPicPath); 157 //調用線程命令進行轉碼 158 ProcessBuilder builder = new ProcessBuilder(commend); 159 builder.command(commend); 160 builder.start(); 161 } catch (Exception e) { 162 e.printStackTrace(); 163 } 164 String tempFile= codcFilePath; 165 boolean status=deleteAVIFile(tempFile);//刪除轉碼後的目標文件 166 System.out.println("是否刪除成功呢"+status); 167 return cutPicPath; 168 } 169 /** 170 * 獲取不帶後綴名的文件名 171 * @param fileUrl 源視頻文件路徑 172 */ 173 public static String getFileNameWithoutSuffix(String fileUrl){ 174 File file=new File(fileUrl); 175 String fileNameWithoutSuffix=file.getName().replaceAll("[.][^.]+$", ""); 176 System.out.println("獲取不帶後綴名的文件名方法中輸出:"+fileNameWithoutSuffix); 177 return fileNameWithoutSuffix; 178 } 179 /** 180 * 刪除轉換後的單個目標視頻文件 181 * @param tempFile 轉換後的目標視頻文件 182 * @return 單個文件刪除成功返回true,不然返回false 183 */ 184 public static boolean deleteAVIFile(String tempFile) { 185 File file = new File(tempFile); 186 if (file.exists()==true) { 187 if (file.delete()==true) { 188 return true; 189 }else{ 190 return false; 191 } 192 }else{ 193 return false; 194 } 195 } 196 197 /** 198 * 視頻轉碼(mencoder.exe或ffmpeg.exe執行編碼解碼) 199 */ 200 private static String executeCodecs(String videoPath) { 201 // 判斷視頻的類型 202 int type = is_VideoType(videoPath); 203 String picResult = null; 204 //若是是ffmpeg能夠轉換的類型直接轉碼,不然先用mencoder轉碼成AVI 205 if (type == 0) { 206 System.out.println("直接將文件轉爲flv文件"); 207 picResult = convertToFLV(videoPath);// 直接將文件轉爲flv文件 ,並返回截圖路徑 208 } else if (type == 1) { // 209 String codcFilePath = convertToAVI(type,videoPath); //視頻格式轉換後的目標視頻文件路徑 210 211 if (codcFilePath == null){ 212 String message="avi文件沒有獲得"; 213 return message;// avi文件沒有獲得 214 } 215 picResult = convertToFLV(codcFilePath);// 將avi轉爲flv,並返回截圖路徑 216 } 217 return picResult; 218 } 219 }