如何在单个.mp4 ffmpeg android中合并多个.mp4文件

时间:2016-08-29 12:14:26

标签: android merge ffmpeg mp4 concat

我首先合并后,将多个.mp4文件合并为单个.mp4 。正确显示.mp4并且不显示其他视频。

我使用了这个ffmpeg命令

ffmpeg -f concat -i " + strTextPath + " -c copy " + strFinalMergedVideoPath;

1 个答案:

答案 0 :(得分:0)

首先存储要在Arraylist中合并的所有MP4文件,如下所示。

private ArrayList<String> arrFilePaths = new ArrayList<>();

arrFilePaths .add(file1path);

arrFilePaths .add(file2path);

arrFilePaths .add(file3path);

设置输出文件的路径,如下所示。

String strVideoFolderPath = Environment.getExternalStorageDirectory().getAbsolutePath();

之后在Asynctask类下面运行。

public class MergeVideo extends AsyncTask<String, Integer, String> {
        ProgressDialog progressDialog;    

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(MotionFlyerTabActivity.this,"",
                    "Please wait...", true);
            // do initialization of required objects objects here
        }

        @Override
        protected String doInBackground(String... params) {
            try {
                Movie[] inMovies = new Movie[arrFilePaths.size()];
                ArrayList<Movie> _clips = new ArrayList<>();
                for (int i = 0; i < arrFilePaths.size(); i++) {
                    inMovies[i] = MovieCreator.build(
                            arrFilePaths.get(i));
                }
                List<Track> videoTracks = new LinkedList<>();
                List<Track> audioTracks = new LinkedList<>();
                for (Movie m : inMovies) {
                    for (Track t : m.getTracks()) {
                        if (t.getHandler().equals("soun")) {
                            audioTracks.add(t);
                        }
                        if (t.getHandler().equals("vide")) {
                            videoTracks.add(t);
                        }
                    }
                }

                Movie result = new Movie();

                if (audioTracks.size() > 0) {
                    result.addTrack(new AppendTrack(audioTracks
                            .toArray(new Track[audioTracks.size()])));
                }
                if (videoTracks.size() > 0) {
                    result.addTrack(new AppendTrack(videoTracks
                            .toArray(new Track[videoTracks.size()])));
                }

                BasicContainer out = (BasicContainer) new DefaultMp4Builder()
                        .build(result);



                FileChannel fc = new RandomAccessFile(String.format(strVideoFolderPath + "/output.mp4"), "rw").getChannel();
                out.writeContainer(fc);
                fc.close();

                File file = new File(strVideoFolderPath + "/output.mp4");
                String mFileName = file.getAbsolutePath();

                return mFileName;


            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String value) {
            super.onPostExecute(value);
            progressDialog.dismiss();

        }
    }