ffmpeg 将视频分割为小段
生活随笔
收集整理的這篇文章主要介紹了
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 将视频分割为小段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于前端文件命名与编写规范(一)
- 下一篇: 小米手机视频工具箱详细设置方法分享