9

I started learning about java coding and I want to split the video file, so here I obtained the code from youtube. The code split the file into parts of required mb I did some modification wanting it to split the file into required number of parts. This original code splits the file into 16 mb here :

if(e==1024*1024*16) // split the file to 16 mb for each part
        {
            e =0L;
            fout.close();
            doPart();
        }

so if I put want the value in kb eg. 300kb for each part, the program just does not split the file for me.

    package fsplit;

    import java.io.File;
    import java.io.RandomAccessFile;

    public class SplitVid {
    public static void main(String args[])
    {
        try {
            new SplitVid();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } // end main
    File f=new File("thisfile.mp4");
    long fsize = f.length()/1024; // file size in bytes
    long parts = 9; // Divide the file into how many parts?
    long fsizeOfEachinkB = fsize/parts;
    int readInt;
    RandomAccessFile fin, fout;
    byte b[] = new byte[2048];
    long e = 0L;
    int j = 1;
    public SplitVid() throws Exception
    {
        fin=new RandomAccessFile(f, "r");
        doPart();

    }

    public void doPart() throws Exception
    {
        fout = new RandomAccessFile(f.getPath() + "Part"+j++, "rw");

        while((readInt = fin.read(b))!= -1)
        {
            fout.write(b, 0, readInt);
            e+= readInt;


            **if(e==1024*fsizeOfEachinkB)//divide each file into fsize/parts per file**
            {
                e =0L;
                fout.close();
                doPart();
            }
        }
        System.out.println("The size of this file is " + f.length()/1024 + " kb");
        System.out.println("The file is divided into " + parts + " parts");
        System.out.println("Each part has " + fsizeOfEachinkB + " kb");
        fout.close();
        fin.close();
        f.delete(); // deletes the original file after the split is done

    }


} //end class

Now if I increase 'parts' until fsizeOfEachinkB is less than 1 mb, then the program just does not split the files at all. Anyone please help me looking into this ?

UdayKiran Pulipati
  • 6,579
  • 7
  • 67
  • 92
user3449016
  • 99
  • 1
  • 1
  • 4

4 Answers4

16

Split the File Despicable Me 2 - Trailer (HD) - YouTube.mp4 into twenty equal parts

Note: Paste the file Despicable Me 2 - Trailer (HD) - YouTube.mp4 under Documents folder.

Example of split video file into multiple video files using java.

Code:

package com.uk.mysqlmaven.jsf.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * 
 * @author uday.p
 *
 */
public class SplitVideoFile {
    public static void main(String[] args) {
        try {
            File file = new File("C:/Documents/Despicable Me 2 - Trailer (HD) - YouTube.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("C:/Documents/Videos_Split/"+ 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();
    }
}
}

Console Output:

File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/01_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/02_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/03_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/04_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/05_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/06_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/07_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/08_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/09_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/10_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/11_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/12_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/13_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/14_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/15_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/16_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/17_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/18_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/19_Despicable Me 2 - Trailer (HD) - YouTube.mp4
File Created Location: C:\Documents\Videos_Split\Despicable Me 2 - Trailer (HD) - YouTube/20_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Total files Split ->20

Screenshot of Saved video files in Windows 8:

Split video file using java into individual parts

Below is the code for Join all video files as a single video file after split the video into multiple video files.

Note: Required jar file commons-io-2.2.jar

Code:

package com.uk.mysqlmaven.jsf.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
 * 
 * @author uday.p
 *
 */
public class JoinVideoFile {
    public static void main(String[] args) {
        try {
            File splitFiles = new File("C:/Documents/Videos_Split/Despicable Me 2 - Trailer (HD) - YouTube/");// get all files which are to be join
            if (splitFiles.exists()) {
                File[] files = splitFiles.getAbsoluteFile().listFiles();
                if (files.length != 0) {
                    System.out.println("Total files to be join: "+ files.length);

                String joinFileName = Arrays.asList(files).get(0).getName();
                System.out.println("Join file created with name -> "+ joinFileName);

                String fileName = joinFileName.substring(0, joinFileName.lastIndexOf("."));// video fileName without extension
                File fileJoinPath = new File("C:/Documents/Videos_Join/"+ fileName);// merge video files saved in this location

                if (!fileJoinPath.exists()) {
                    fileJoinPath.mkdirs();
                    System.out.println("Created Directory -> "+ fileJoinPath.getAbsolutePath());
                }

                OutputStream outputStream = new FileOutputStream(fileJoinPath.getAbsolutePath() +"/"+ joinFileName);

                for (File file : files) {
                    System.out.println("Reading the file -> "+ file.getName());
                    InputStream inputStream = new FileInputStream(file);

                    int readByte = 0;
                    while((readByte = inputStream.read()) != -1) {
                        outputStream.write(readByte);
                    }
                    inputStream.close();
                }

                System.out.println("Join file saved at -> "+ fileJoinPath.getAbsolutePath() +"/"+ joinFileName);
                outputStream.close();
            } else {
                System.err.println("No Files exist in path -> "+ splitFiles.getAbsolutePath());
            }
        } else {
            System.err.println("This path doesn't exist -> "+ splitFiles.getAbsolutePath());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Console output:

Total files to be join: 20
Join file created with name -> 01_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 01_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 02_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 03_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 04_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 05_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 06_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 07_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 08_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 09_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 10_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 11_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 12_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 13_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 14_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 15_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 16_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 17_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 18_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 19_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Reading the file -> 20_Despicable Me 2 - Trailer (HD) - YouTube.mp4
Join file saved at -> C:\Documents\Videos_Join\01_Despicable Me 2 - Trailer (HD) - YouTube/01_Despicable Me 2 - Trailer (HD) - YouTube.mp4

Screenshot of Join Video file saved in Windows 8: Join file screenshot

UdayKiran Pulipati
  • 6,579
  • 7
  • 67
  • 92
3

video splited successfully but video not playing( The Player might not support the file type or might not support the codec that was used to compress the file.)

package Spitvideo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * 
 * @author uday.p
 *
 */
public class SplitVideoFile {
    public static void main(String[] args) {
        try {
            File file = new File("f:/SampleVideo_1080x720_30mb.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("d:/"+ 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 = 5;// Total files to split.
            int splitSize = inputStream.available() / totalPartsToSplit;
            int streamSize = 0;
            int read = 0;
            System.err.println("<<<<<<<<"+splitSize);
            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();
    }
}
}
Naveen Maurya
  • 197
  • 1
  • 1
  • 10
2

For Specific Split you have to Do following things..

1]Calculate No of partitions can be made by this file.

Means if you want every part of 300KB than...

calculeteParts=(long)(fsize/(300));//As fsize already in KB in your program.(FOR FILE IN MB)

2]For Making No of Parts say from file f we can make 30 patitions of Size 300KB.

while((readInt = fin.read(b))!= -1)
        {

            fout.write(b, 0, readInt);
            e+= readInt;

          if(e==300*1024)//if Read 300 Upcoming KBs done 
            {
                e =0L;

                  fout.close();
                  doPart();


            }


        }

But Most importantly

PROBLEM NEED TO SOLVE

Say you have A file of size 9.04MB and you want to divide it into 300KB partitions. So programmatically doing this you will have to make it multiple of 300KB.

Example.

9.04*1024=9256.46KB
So total of 9256KB approximately

Now Divide it with your needed size
9256/300=30.85 so approximately 30 parts.

So 0.85 will be lost

Or if you take **31**:

300*31=9300 which is greater than 9256

doParts(); method called recursively so at LAST PART which MAY NOT be upto size 300KB it will read upto possible value but after that it will generate Stream Closed:IOEXception Eventhough it doesn't matter to you.Than it's fine.

akash
  • 22,664
  • 11
  • 59
  • 87
  • Thank you, I will need that last part to be the same too. So I try putting fout.setLength(1024 * fsizeOfEachinkB); // in this case fsizeOfEachinkB will be 300 into doPart() method. Will this work? – user3449016 Mar 24 '14 at 04:05
  • Thing is, I want to split each file to 2^n (say 512kb) each and then before joining back the parts. I was thinking about setting the last part back to the original size before the join. – user3449016 Mar 24 '14 at 04:47
1

You can split into more files but if you want play it you must decode the video, split and then encode again.

Most popular libray to do this is FFMPEG, you can find some JAVA wrapper.

How to split in 2 seconds parts:


    package com;

    import java.nio.file.FileSystems;
    import java.nio.file.Path;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicLong;

    import com.github.kokorin.jaffree.ffmpeg.FFmpeg;
    import com.github.kokorin.jaffree.ffmpeg.FFmpegProgress;
    import com.github.kokorin.jaffree.ffmpeg.NullOutput;
    import com.github.kokorin.jaffree.ffmpeg.ProgressListener;
    import com.github.kokorin.jaffree.ffmpeg.UrlInput;
    import com.github.kokorin.jaffree.ffmpeg.UrlOutput;

    public class SplitVideo
    {
        void split()
        {
            Path    pathToFFmpeg    = FileSystems.getDefault().getPath("my_ffmpeg_bin_dir");
            String  videoDir        = "video_path/";
            String  filename        = "scena_1";
            long    outputDuration  = 2000;
            long    inputDuration   = 0;
            
            //
            // Get input duration
            final AtomicLong durationMillis = new AtomicLong();

            FFmpeg.atPath(pathToFFmpeg)
            .addInput(UrlInput.fromUrl( pathToFile ))
            .addOutput(new NullOutput())
            .setProgressListener(
                    new ProgressListener()
                    {
                        @Override
                        public void onProgress(FFmpegProgress progress)
                        {
                            durationMillis.set(progress.getTimeMillis());
                        }
                    }
                )
            .execute();

            inputDuration = durationMillis.get();
            
            System.out.println(filename + " duration: " + inputDuration + " milliseconds");
            
            //
            // Split Video
            int nVideoOut = (int) Math.ceil( 1.0 * inputDuration / outputDuration );
            
            System.out.println("Output video count: " + nVideoOut);

            
            long currPoint = 0;
            
            for(int n=0; n < nVideoOut; n++)
            {
                long remaining = inputDuration - ( outputDuration * n );
                
                long currOutputDuration = remaining > outputDuration ? outputDuration : remaining;
                
                System.out.println("Video " + (n+1) + ": " + currPoint + " / " + currOutputDuration);
                
                FFmpeg.atPath(pathToFFmpeg)
                .addInput(
                        UrlInput.fromUrl( videoDir + filename + ".mp4" )
                        .setPosition(currPoint, TimeUnit.MILLISECONDS)
                        .setDuration(currOutputDuration, TimeUnit.MILLISECONDS)
                        )
                .addOutput(
                        UrlOutput.toPath(FileSystems.getDefault().getPath( videoDir + filename + "_part_" + n + ".mp4" ))
                        .setPosition(0, TimeUnit.MILLISECONDS)
                        )
                .setOverwriteOutput(true)
                .execute();
                
                currPoint += outputDuration;
            }
        }
    }

If your target is split video to create a m3u8 playlist you can use this:

ffmpeg -y -i myvideo.mp4 -codec copy -bsf h264_mp4toannexb -map 0 -f segment -segment_time 10 -segment_format mpegts -segment_list "playlist.m3u8" -segment_list_type m3u8 "myvideo_part_%d.ts"
Diarex
  • 39
  • 4