日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JAVA使用ffmepg處理視頻的方法(壓縮,分片,合并)

瀏覽:106日期:2022-08-12 16:01:56
FFmepg安裝

路徑:然后在使用的類中生命一個(gè)全局變量就好

private static String ffmpegPath = 'C:hkffmpegbinffmpeg.exe'; //ffmepg的絕對(duì)路徑視頻壓縮

注意:此壓縮視頻涉及轉(zhuǎn)碼,對(duì)cpu的占用比較大(能不壓縮盡量不壓縮)

/** * 壓縮視頻 * @param convertFile 待轉(zhuǎn)換的文件 * @param targetFile 轉(zhuǎn)換后的目標(biāo)文件 */ public static void toCompressFile(String convertFile,String targetFile) throws IOException {List<String> command = new ArrayList<String>();/**將視頻壓縮為 每秒15幀 平均碼率600k 畫面的寬與高 為1280*720*/command.add(ffmpegPath);command.add('-i');command.add(convertFile);command.add('-r');command.add('15');command.add('-b:v');command.add('600k');command.add('-s');command.add('1280x720');command.add(targetFile);ProcessBuilder builder = new ProcessBuilder(command);Process process = null;try { process = builder.start();} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace();}// 使用這種方式會(huì)在瞬間大量消耗CPU和內(nèi)存等系統(tǒng)資源,所以這里我們需要對(duì)流進(jìn)行處理InputStream errorStream = process.getErrorStream();InputStreamReader inputStreamReader = new InputStreamReader(errorStream);BufferedReader br = new BufferedReader(inputStreamReader);String line = '';while ((line = br.readLine()) != null) {}if (br != null) { br.close();}if (inputStreamReader != null) { inputStreamReader.close();}if (errorStream != null) { errorStream.close();}logger.info('-------------------壓縮完成---轉(zhuǎn)存文件--'+targetFile+'-------------'); }獲取視頻合并

/** * ffmpeg合并多個(gè)視頻文件 * * @param list 需要合并的多視頻url地址以List存放 * @param outputDir 此處是ffmpeg 配置地址,可寫死如“E:/ffmpeg/bin/ffmpeg.exe” * @param outputFile 合并后的視頻存放地址,如:E:/mergevideo.mp4 * @date: 2021/4/17 9:31 * @return: void */ public static String mergeVideo(List<String> list, String outputDir, String outputFile) {try { String format1 = '%s -i %s -c copy -bsf:v h264_mp4toannexb -f mpegts %s'; List<String> commandList = new ArrayList<>(6); List<String> inputList = new ArrayList<>(6); for (int i = 0; i < list.size(); i++) {String input = String.format('input%d.ts', i + 1);String command = String.format(format1, ffmpegPath, list.get(i), outputDir + input);commandList.add(command);inputList.add(input); } String command = getCommand(outputDir,outputFile, inputList); commandList.add(command); Boolean falg = Boolean.FALSE; for (int i = 0; i < commandList.size(); i++) {if (execCommand(commandList.get(i)) > 0) falg = true; } if (falg) {for (int i = 0; i < inputList.size(); i++) { if (i != commandList.size() - 1) {File file = new File(outputDir + inputList.get(i));file.delete(); }}////刪除壓縮的文件//for (String s:list// ) {// new File(s).delete();//}return outputFile; } else {return 'fail'; }} catch (Exception e) { e.printStackTrace(); logger.error('-----合并失敗!!!!!!' + outputFile); return 'fail';} } private static Integer execCommand(String command) {logger.info('execCommand.exec command={}',command);try { Process process = Runtime.getRuntime().exec(command); //獲取進(jìn)程的標(biāo)準(zhǔn)輸入流 final InputStream is1 = process.getInputStream(); //獲取進(jìn)城的錯(cuò)誤流 final InputStream is2 = process.getErrorStream(); //啟動(dòng)兩個(gè)線程,一個(gè)線程負(fù)責(zé)讀標(biāo)準(zhǔn)輸出流,另一個(gè)負(fù)責(zé)讀標(biāo)準(zhǔn)錯(cuò)誤流 readInputStream(is1); readInputStream(is2); process.waitFor(); process.destroy(); logger.info('-----操作成功' + command + ' ' + sdf.format(new Date())); return 1;} catch (Exception e) { e.printStackTrace(); System.out.println('-----操作失敗' + command); return -1;} } private static void readInputStream(InputStream inputStream) {new Thread(() -> { BufferedReader br1 = new BufferedReader(new InputStreamReader(inputStream)); try {String line1;while ((line1 = br1.readLine()) != null) { if (line1 != null) { }} } catch (IOException e) {e.printStackTrace(); } finally {try { inputStream.close();} catch (IOException e) { e.printStackTrace();} }}).start(); }視頻分片(分割)

/** * 將視頻分割為小段 * * @param fileName 源文件名字(帶路徑) * @param outputPath 輸出文件路徑,會(huì)在該路徑下根據(jù)系統(tǒng)時(shí)間創(chuàng)建目錄,并在此目錄下輸出段視頻 * @param videoTime 總時(shí)間,單位 分鐘 * @param periodTime 小段視頻時(shí)長(zhǎng) 單位 分鐘 * @param merge true合并,false單獨(dú)分割 說(shuō)明:是否將整個(gè)視頻結(jié)尾部分不足一次分割時(shí)間的部分,合并到最后一次分割的視頻中,即false會(huì)比true多生成一段視頻 */ public static List<Map<String,Object>> splitVideoFile(String fileName, String outputPath, float videoTime, int periodTime, boolean merge) {final String TAG = '----------------------------';// 在outputPath路徑下根據(jù)系統(tǒng)時(shí)間創(chuàng)建目錄File file = createFileBySysTime(outputPath);if (file == null) { System.out.println('分割視頻失敗,創(chuàng)建目錄失敗'); return null;}outputPath = file.getPath() + File.separator; // 更新視頻輸出目錄// 計(jì)算視頻分割的個(gè)數(shù)int count;// 分割為幾段float remain = 0; // 不足一次剪輯的剩余時(shí)間if (merge) { count = (int) (videoTime / periodTime); remain = videoTime % periodTime; // 不足一次剪輯的剩余時(shí)間} else { count = (int) (videoTime / periodTime) + 1;}System.out.println('將視頻分割為' + count + '段,每段約' + periodTime + '分鐘');String indexName; // 第 i 個(gè)視頻,打印日志用final String FFMPEG = ffmpegPath;String startTime; // 每段視頻的開(kāi)始時(shí)間String periodVideoName; // 每段視頻的名字,名字規(guī)則:視頻i_時(shí)間段xx_yyfloat duration; // 每次分割的時(shí)長(zhǎng)String command;// 執(zhí)行的命令// 得到視頻后綴 如.mp4String videoSuffix = fileName.substring(fileName.lastIndexOf('.'));//得到點(diǎn)后面的后綴,包括點(diǎn)Runtime runtime = Runtime.getRuntime(); // 執(zhí)行命令者List<Map<String,Object>> list =new ArrayList<>();// 將視頻分割為count段for (int i = 0; i < count; i++) { Map<String,Object> map =new HashMap<>(); indexName = '第' + (i+1) + '個(gè)視頻'; // 決定是否將整個(gè)視頻結(jié)尾部分不足一次的時(shí)間,合并到最后一次分割的視頻中 if (merge) {if (i == count - 1) { duration = periodTime * 60 + remain * 60;// 將整個(gè)視頻不足一次剪輯的時(shí)間,拼接在最后一次剪裁中 if(periodTime * i /60 >= 1){startTime = '0'+periodTime * i /60+ ':00:00'; }else{startTime = periodTime * i + ':00'; } periodVideoName = 'video' + (i+1) + '_' + periodTime * i + '_end' + videoSuffix;} else { duration = periodTime * 60; if(periodTime * i /60 >= 1){startTime = '0'+periodTime * i /60+ ':00:00'; }else{startTime = periodTime * i + ':00'; } periodVideoName = 'video' +(i+1) + '_' + periodTime * i + '_' + periodTime * (i + 1) + videoSuffix;} } else {duration = periodTime * 60;if(periodTime * i /60 >= 1){ startTime = '0'+periodTime * i /60+ ':00:00';}else{ startTime = periodTime * i + ':00';}periodVideoName = 'video' + (i+1) + '_' + periodTime * i + '_' + periodTime * (i + 1) + videoSuffix; } // 執(zhí)行分割命令 try {// 創(chuàng)建命令command = FFMPEG + ' -ss ' + startTime +' -accurate_seek '+ ' -i ' + fileName + ' -c copy -t ' + duration + ' ' + outputPath + periodVideoName;System.out.println(TAG);System.out.println(indexName);System.out.println('執(zhí)行命令:' + command);runtime.exec(command);System.out.println(indexName + '分割成功');map.put('videoPath',(outputPath + periodVideoName).replace('','/'));map.put('count',i);list.add(map); } catch (Exception e) {e.printStackTrace();System.out.println(indexName + '分割失敗!!!!!!'); }}//刪除原來(lái)的大視頻new File(fileName).delete();return list; }/** * 在指定目錄下根據(jù)系統(tǒng)時(shí)間創(chuàng)建文件夾 * 文件名字eg:2019-07-02-23-56-31 * * @param path 路徑:eg: '/Users/amarao/業(yè)余/剪輯/output/'; * 結(jié)果:創(chuàng)建成功/Users/amarao/業(yè)余/剪輯/output/2019-07-03-10-28-05 * <p> * 步驟: * 1. 讀取系統(tǒng)時(shí)間 * 2. 格式化系統(tǒng)時(shí)間 * 3. 創(chuàng)建文件夾 * <p> * 參考:http://www.bubuko.com/infodetail-1685972.html */ public static File createFileBySysTime(String path) {// 1. 讀取系統(tǒng)時(shí)間Calendar calendar = Calendar.getInstance();Date time = calendar.getTime();// 2. 格式化系統(tǒng)時(shí)間SimpleDateFormat format = new SimpleDateFormat('yyyy-MM-dd-HH-mm-ss');String fileName = format.format(time); //獲取系統(tǒng)當(dāng)前時(shí)間并將其轉(zhuǎn)換為string類型,fileName即文件名// 3. 創(chuàng)建文件夾String newPath = path + fileName;File file = new File(newPath);//如果文件目錄不存在則創(chuàng)建目錄if (!file.exists()) { if (!file.mkdir()) {System.out.println('當(dāng)前路徑不存在,創(chuàng)建失敗');return null; }}System.out.println('創(chuàng)建成功' + newPath);return file; }獲取視頻的時(shí)長(zhǎng)

/** * 獲取視頻時(shí)長(zhǎng) 單位/秒 * @param video * @return */ public static long getVideoDuration(File video) {long duration = 0L;FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);try { ff.start(); duration = ff.getLengthInTime() / (1000 * 1000 * 60); ff.stop();} catch (FrameGrabber.Exception e) { e.printStackTrace();}return duration; }視頻剪切

/** * *剪切視頻 videoInputPath 需要處理的視頻路徑 startTime: 截取的開(kāi)始時(shí)間 格式為 00:00:00(時(shí)分秒) endTime: 截取的結(jié)束時(shí)間 格式為00:03:00(時(shí)分秒) devIp: 通道號(hào) 業(yè)務(wù)存在 ,可自行刪除 * */ public static String videoClip(String videoInputPath,String startTime,String endTime,String devIp) throws IOException {SimpleDateFormat sdf1=new SimpleDateFormat('yyyy-MM-dd');SimpleDateFormat dtf=new SimpleDateFormat('yyyyMMddHHmmss');//判斷轉(zhuǎn)碼文件是否存在if(!new File(videoInputPath).exists()){ System.out.println('需要處理的視頻不存在'); return null;}StringBuffer videoOutPath = new StringBuffer();videoOutPath.append('C:/video/playBack/'+devIp+'/'+sdf1.format(new Date())+'/clip/');File file = new File(videoOutPath.toString());if (!file.exists()){ file.mkdirs();}videoOutPath.append(dtf.format(new Date())+'.mp4');List<String> command = new ArrayList<String>();command.add(ffmpegPath);command.add('-ss');command.add(startTime);command.add('-t');command.add(endTime);command.add('-i');command.add(videoInputPath);command.add('-c');command.add('copy');command.add(videoOutPath.toString());command.add('-y');ProcessBuilder builder = new ProcessBuilder(command);Process process = null;try { process = builder.start();} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace();}InputStream errorStream = process.getErrorStream();InputStreamReader inputStreamReader = new InputStreamReader(errorStream);BufferedReader br = new BufferedReader(inputStreamReader);String line = '';while ((line = br.readLine()) != null) {}if (br != null) { br.close();}if (inputStreamReader != null) { inputStreamReader.close();}if (errorStream != null) { errorStream.close();}return videoOutPath.toString(); }視頻轉(zhuǎn)GIF(MP4)

/* * 視頻轉(zhuǎn)gif *inputVideoPath 需要轉(zhuǎn)換的視頻 * createGif gif保存的位置 * */ public static String mp4ToGif(String inputVideoPath,String createGif) {String name = UUID.randomUUID().toString().replaceAll('-', '');String paletteFile = createGif +name + '.png';String gifFile = createGif+name + '.gif';boolean isComplete = false;//操作ffmpeg生成gif圖片for (int i = 0; i < 5; i++) { try {//生成調(diào)色板Process p = new ProcessBuilder().command(ffmpegPath,'-v', 'warning','-ss', '2','-t', '10','-i', inputVideoPath,'-vf', 'fps=5,scale=400:-1:flags=lanczos,palettegen','-y', paletteFile, '-vn').redirectError(new File('stderr.txt')).start();isComplete = p.waitFor(10, TimeUnit.SECONDS);if (!isComplete) { System.out.println('生成調(diào)色板出錯(cuò)');} else { List<String> command = new ArrayList<String>(); /**將視頻壓縮為 每秒15幀 平均碼率600k 畫面的寬與高 為1280*720*/ command.add(ffmpegPath); command.add('-v'); command.add('warning'); command.add('-ss'); command.add('2'); command.add('-t'); command.add('10'); command.add('-i'); command.add(inputVideoPath); command.add('-i'); command.add(paletteFile); command.add('-lavfi'); command.add('fps=5,scale=400:-1:flags=lanczos [x]; [x][1:v] paletteuse'); command.add('-y'); command.add(gifFile); command.add('-vn'); ProcessBuilder builder = new ProcessBuilder(command); Process process = null; try {process = builder.start();isComplete = process.waitFor(10, TimeUnit.SECONDS);if (isComplete) { new File(paletteFile).delete(); System.out.println('生成gif成功'); break;} else { System.out.println('生成gif出錯(cuò)');} } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace(); }//process = new ProcessBuilder()// .command(ffmpegPath,// '-v', 'warning',// '-ss', '2',// '-t', '10',// '-i', 'E:Video_2021-05-14_113013.mp4',// '-i', paletteFile,// '-lavfi', 'fps=5,scale=400:-1:flags=lanczos [x]; [x][1:v] paletteuse',// '-y', gifFile, '-vn')// .redirectError(new File('stderr.txt'))// .start();// isComplete = process.waitFor(10, TimeUnit.SECONDS);// if (isComplete) {//System.out.println('生成gif成功');//break;// } else {//System.out.println('生成gif出錯(cuò)');// }} } catch (Exception e) {System.out.println('生成gif出錯(cuò)'); }}return gifFile; }

以上就是JAVA使用ffmepg處理視頻的方法(壓縮,分片,合并)的詳細(xì)內(nèi)容,更多關(guān)于java ffmepg處理視頻的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品婷婷色在线观看| 91福利精品在线观看| 国产精品18| 国产亚洲一区二区三区啪| 日韩精品欧美大片| 欧美天堂在线| 国产不卡av一区二区| 成人一区而且| av一区在线| 在线一区免费| 一二三区精品| 天堂俺去俺来也www久久婷婷| 蜜桃久久精品一区二区| 日韩综合一区二区| 日韩欧美高清一区二区三区| 综合干狼人综合首页| 国产调教一区二区三区| 久久免费精品| 亚洲午夜av| 日韩国产专区| 丝袜诱惑制服诱惑色一区在线观看 | 成人国产精品一区二区网站| 日韩久久视频| 亚洲我射av| 久久99久久人婷婷精品综合| 激情综合五月| 视频一区二区三区在线| 久久香蕉网站| 蜜桃91丨九色丨蝌蚪91桃色| 久久精品国产99国产精品| 九九精品调教| 欧美日韩xxxx| 国产亚洲在线观看| 激情黄产视频在线免费观看| 日韩在线一区二区| 激情久久99| 久久国产三级| 老司机久久99久久精品播放免费| 久久不见久久见免费视频7| 成人精品亚洲| 久久不见久久见国语| 日韩欧美中文字幕一区二区三区| 播放一区二区| 国产福利片在线观看| 91精品国产经典在线观看| 黄色日韩精品| 999国产精品| 91亚洲自偷观看高清| 国产免费播放一区二区| 亚洲3区在线| 国产一区二区亚洲| 国产伦乱精品| 69堂免费精品视频在线播放| 亚洲一区二区成人| 久久69成人| 欧美激情日韩| 综合国产在线| 免费人成网站在线观看欧美高清| 国产成人免费精品| 久久男人av| 国产精品亚洲欧美日韩一区在线| 亚洲1区在线观看| 国产精品普通话对白| 亚洲午夜一级| 国产suv精品一区| 精品国产乱码久久久久久1区2匹| 欧美伊人影院| 欧美国产不卡| 欧美激情在线精品一区二区三区| 亚洲欧美专区| 日韩精品五月天| 日韩国产成人精品| 欧美专区一区| 老鸭窝一区二区久久精品| 国产精品麻豆成人av电影艾秋| 欧美日韩亚洲一区二区三区在线| 国产日韩欧美一区二区三区 | 另类综合日韩欧美亚洲| 日韩欧美一区二区三区在线视频| 亚洲一区网站| 久久丁香四色| 国产一区二区三区免费在线| 成人在线黄色| 国产亚洲福利| 97久久中文字幕| 国产精品毛片久久| 伊人影院久久| 欧美亚洲免费| 亲子伦视频一区二区三区| 亚洲精品成人| 国产毛片一区二区三区| 精品捆绑调教一区二区三区| 中文字幕亚洲精品乱码| 亚洲精品在线二区| 国产伦理一区| 模特精品在线| 国产伊人久久| 亚洲深深色噜噜狠狠爱网站| 国产精区一区二区| 亚洲视频播放| 国产96在线亚洲| 在线看片一区| 99视频精品全部免费在线视频| 婷婷亚洲精品| 欧美在线亚洲综合一区| 国产乱人伦精品一区| 日韩综合精品| 亚洲精品影院在线观看| 成人福利av| 久久不卡日韩美女| 日韩欧美中文字幕在线视频| 不卡在线一区| 国产资源在线观看入口av| 日本国产亚洲| 日韩中文字幕麻豆| 国产综合色产| 中文字幕色婷婷在线视频| 老牛国内精品亚洲成av人片| 一区二区91| 爽好多水快深点欧美视频| 日韩欧美看国产| 91嫩草亚洲精品| 日韩av专区| 久久精品网址| 国产精品一区二区免费福利视频| 蜜臀91精品一区二区三区| 中文久久精品| 水蜜桃久久夜色精品一区的特点| 欧美亚洲tv| 国产日韩欧美三区| 国产精品一区二区精品视频观看| 日韩国产欧美三级| 欧美日韩亚洲一区二区三区在线| 日韩精品欧美大片| 香蕉久久久久久| 日韩高清三区| 国产精品亚洲综合色区韩国 | 欧美久久天堂| 91精品国产调教在线观看| 999久久久国产精品| 九一成人免费视频| 亚洲黄页一区| 亚洲精品成人一区| 国产精品v一区二区三区| 国产精品午夜一区二区三区| 国产福利一区二区三区在线播放| 精品视频一区二区三区在线观看| 欧美极品一区二区三区| 日韩理论片av| 免费久久精品视频| 国产精品成人3p一区二区三区| 九九九精品视频| 嫩呦国产一区二区三区av| 97国产成人高清在线观看| 尤物在线精品| 麻豆91精品91久久久的内涵| 成人看片网站| 日韩中出av| 亚洲伦乱视频| 中文字幕免费一区二区| 国产欧美成人| japanese国产精品| 国产精品巨作av| 五月天久久网站| 久久久久九九精品影院| 欧美成人基地 | 国产九一精品| 亚洲一区欧美二区| 国产一区二区亚洲| 日本精品在线播放| 亚洲女同一区| 久久影院午夜精品| 国产精品成人3p一区二区三区| 黄色国产精品| 极品av在线| 精品视频91| 日本久久二区| 中文字幕一区二区av| 香蕉精品久久| 日韩激情一区| 欧美aⅴ一区二区三区视频| 视频一区在线视频| 亚洲一级黄色| 久久久久久久久丰满| 精品国产鲁一鲁****| 国产精品一国产精品| 久久国产人妖系列| 日韩高清在线观看一区二区| 亚洲深夜福利在线观看| 国产亚洲毛片在线| 欧美专区18| 好看的亚洲午夜视频在线| 久久美女精品| 免费av一区| 午夜精品免费| 波多视频一区| 国际精品欧美精品| 欧美xxxx中国| 久久精品国产99久久| 欧美特黄a级高清免费大片a级|