将视频拆分为Java中较小的定时段

时间:2015-03-26 10:23:20

标签: java video split

我希望拍摄一个大型视频文件(3小时+)并传入我要分割的视频片段。

例如,我可以传入3小时的视频 - 并希望从00:10到00:11分成单独的文件。

我目前拥有以下代码 - 将我的视频分割为分割号码。段,但我将如何按时间分割视频?

代码:

            try {
                File file = new File("//Users//robeves//Desktop//Videos to split//TestVideo.mp4");//File read from Source folder to Split.
                if (file.exists()) {

                String videoFileName = file.getName().substring(0, file.getName().lastIndexOf(".")); // Name of the videoFile without extension
                File splitFile = new File("//Users//robeves//Desktop//Videos to split//Converted//"+ videoFileName);//Destination folder to save.
                if (!splitFile.exists()) {
                    splitFile.mkdirs();
                    System.out.println("Directory Created -> "+ splitFile.getAbsolutePath());
                }

                int i = 01;// Files count starts from 1
                InputStream inputStream = new FileInputStream(file);
                String videoFile = splitFile.getAbsolutePath() +"/"+ String.format("%02d", i) +"_"+ file.getName();// Location to save the files which are Split from the original file.
                OutputStream outputStream = new FileOutputStream(videoFile);
                System.out.println("File Created Location: "+ videoFile);
                int totalPartsToSplit = 20;// Total files to split.
                int splitSize = inputStream.available() / totalPartsToSplit;
                int streamSize = 0;
                int read = 0;
                while ((read = inputStream.read()) != -1) {

                    if (splitSize == streamSize) {
                        if (i != totalPartsToSplit) {
                            i++;
                            String fileCount = String.format("%02d", i); // output will be 1 is 01, 2 is 02
                            videoFile = splitFile.getAbsolutePath() +"/"+ fileCount +"_"+ file.getName();
                            outputStream = new FileOutputStream(videoFile);
                            System.out.println("File Created Location: "+ videoFile);
                            streamSize = 0;
                        }
                    }
                    outputStream.write(read);
                    streamSize++;
                }

                inputStream.close();
                outputStream.close();
                System.out.println("Total files Split ->"+ totalPartsToSplit);
            } else {
                System.err.println(file.getAbsolutePath() +" File Not Found.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:0)

如果您确实希望能够单独播放片段,那么如果只是在任意点分割文件,则上述代码可能无效,因为许多视频格式需要在良好的边界上完成&# 39;以启用正确播放。

正如Binkan建议的那样,使用像ffmpeg这样的视频库,无论是在cmd行,包裹的cmd行还是使用其相关的C库,都可以让你以最常见的格式安全地分割视频。

例如,以下ffmpeg cmd行将从mp4视频创建一个片段:

ffmpeg -i inputVideo.mp4 -ss 00:00:00 -t 00:00:10 -c copy outputVideoSegment.mp4

以下代码在'包装器中使用此实用程序。将视频文件分割成块:

        int chunkSize = videoDurationSecs/(numberOfChunks + 1);
        int startSecs = 0;
        for (int i=0; i<numberOfChunks; i++) {
            //Create video chunk
            String startTime = convertSecsToTimeString(startSecs);
            int endSecs = startSecs + ((i+1)*chunkSize);
            if (endSecs > videoDurationSecs) {
                //make sure rounding does not mean we go beyond end of video
                endSecs = videoDurationSecs;
            }
            String endTime = convertSecsToTimeString(endSecs);

            //Call ffmpeg to create this chunk of the video using a ffmpeg wrapper
            String argv[] = {"ffmpeg", "-i", videoPath, 
                    "-ss",startTime, "-t", endTime,
                    "-c","copy", segmentVideoPath[i]};
            int ffmpegWrapperReturnCode = ffmpegWrapper(argv);
        }


        String convertSecsToTimeString(int timeSeconds) {
            //Convert number of seconds into hours:mins:seconds string
            int hours = timeSeconds / 3600;
            int mins = (timeSeconds % 3600) / 60;
            int secs = timeSeconds % 60;
            String timeString = String.format("%02d:%02d:%02d", hours, mins, secs);
            return timeString;
        }

包装器的例子在这里,但你也可以直接使用ffmpeg库,如果你宁愿避免使用包装器方法(它的缺点是ffmpeg cmd line并不是真的打算以这种方式包装):