简体   繁体   English

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

[英]How to merge multiple .mp4 file in single .mp4 ffmpeg android

I am merging multiple .mp4 file into single .mp4 after merging only first .mp4 is displayed properly and other video is not displayed. 我仅将第一个.mp4正确显示且不显示其他视频后,才将多个.mp4文件合并到单个.mp4中

I used this ffmpeg command 我用了这个ffmpeg命令

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

First store all the MP4 file which you want to merge in Arraylist like below. 首先,将要合并的所有MP4文件存储在Arraylist中,如下所示。

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

arrFilePaths .add(file1path);

arrFilePaths .add(file2path);

arrFilePaths .add(file3path);

Set path for output file like below. 设置输出文件的路径,如下所示。

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

After that Run below Asynctask class. 之后,在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();

        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM