日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ffmpeg 将视频分割为小段

發布時間:2024/3/24 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ffmpeg 将视频分割为小段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1. 先看一下分割結果

2. MAC安裝ffmpeg

3. ffmpeg視頻分割命令介紹

4.編寫java程序

(1). 調用:

(2). 視頻分割的java工具類

5.參考:


1. 先看一下分割結果

視頻命名規則:視頻i_時間段xx_yy

  • i:第i個視頻
  • xx:該段視頻的開始時間
  • yy:該段視頻的結束時間,如3即3分鐘處結束,end表示視頻末尾

2. MAC安裝ffmpeg

我是在mac下開發的,即在終端輸入:

brew install ffmpeg

等一會安裝成功即可

3. ffmpeg視頻分割命令介紹

/*** ffmpeg將視頻分割* ffmpeg命令eg:* 1. ffmpeg -ss 00:00:00 -i test.mp4 -c copy -t 600 output.mp4* 此處是將視頻test.mp4從00:00:00處分割600s,分割出的視頻名字是output.mp4* 2. ffmpeg -ss 00:00:00 -t 00:01:30 -i test.mp4 -vcodec copy -acodec copy output.mp4* 此處是將視頻test.mp4從00:00:00處分割到01:30處,分割出的視頻名字是output.mp4** 備注:* 有些視頻裁剪后你會發現可能開始和結束都不是很準確,有可能是從00秒開始,33秒結束。* 因為這些視頻里30秒處地方剛好不是關鍵幀,而ffmpeg會在你輸入的時間點附近圓整到最接近的關鍵幀處,然后做接下來的事情。** <p>* 注釋:* -ss 指定從什么時間開始分割* -i 要分割的視頻文件* -t 指定需要截取多長時間:* 格式如下* 1. -t xx // 單位 秒,指截取30s* 2. -t 00:01:30 // 時:分:秒,指截取到播放時間為01:30處* 注意 :-ss 要放在 -i 之前* <p>*/

4.編寫java程序

此處我直接把封裝好的視頻分割的java程序貼出

(1). 調用:

public static final String VIDEO_PATH = "/Users/amarao/業余/剪輯/電影/我的影片.mp4";public static final String OUTPUT_PATH = "/Users/amarao/業余/剪輯/output/";public static void main(String[] args) throws IOException {// 將VIDEO_PATH分割為3分鐘一段,VIDEO_PATH總共29分鐘,如果結尾有不足3分鐘的拼接的最后一段視頻上FfmpegDevideVideo.splitVideoFile(VIDEO_PATH, OUTPUT_PATH, 29, 3, true);}

(2). 視頻分割的java工具類

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

5.參考:

http://yuncode.net/code/c_58c0fcb615db178

https://www.jianshu.com/p/cf1e61eb6fc8

https://blog.csdn.net/wanglf1986/article/details/54092203


?

總結

以上是生活随笔為你收集整理的ffmpeg 将视频分割为小段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。