java.io.IOException:无法在使用Mp4Parser合并视频中合并AudioSampleEntry

Alo*_*lok 5 video merge android mp4parser

我一直在合并两个视频。我正在从手机存储中提取视频,并以字符串形式传递它们。然后这些视频被合并。我已经看到,如果我要合并从摄像机拍摄的视频,那么它工作正常,合并进行得很好。但是,一旦获取并尝试合并其他视频文件,就会引发异常

java.io.IOException: Cannot merge AudioSampleEntry{bytesPerSample=0, bytesPerFrame=0, bytesPerPacket=0, samplesPerPacket=0, packetSize=0, compressionId=0, soundVersion=0, sampleRate=24000, sampleSize=16, channelCount=2, boxes=[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@fffffab7]} and AudioSampleEntry{bytesPerSample=0, bytesPerFrame=0, bytesPerPacket=0, samplesPerPacket=0, packetSize=0, compressionId=0, soundVersion=0, sampleRate=22050, sampleSize=16, channelCount=2, boxes=[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@fffff9fb]} 08-22 15:59:03.347 27476-27558/in.pinelane.myhovi W/System.err: at com.googlecode.mp4parser.authoring.tracks.AppendTrack.mergeStsds(AppendTrack.java:116) 08-22 15:59:03.347 27476-27558/in.pinelane.myhovi W/System.err: at com.googlecode.mp4parser.authoring.tracks.AppendTrack.<init>(AppendTrack.java:59)
Run Code Online (Sandbox Code Playgroud)

并且不会在存储设备中保存任何文件。另外,如果视频的高度不同,那么它会给我这个例外,并且也不会保存任何文件

E/isoparser: AppendTrack:height differs
Run Code Online (Sandbox Code Playgroud)

这是我的活动,您可以看到以下代码:

//asynch task to merge the videos in background
    class MergeVideos extends AsyncTask<ArrayList<File>, Integer, String>{

        @Override
        protected String doInBackground(ArrayList<File>... params) {
                ArrayList<Movie> inMovies = new ArrayList<>();
                for(File file : params[0]){
                    Movie movie = MovieCreator.build(file.getAbsolutePath());
                    inMovies.add(movie);
                }

                List<Track> videoTracks = new LinkedList<Track>();
                List<Track> audioTracks = new LinkedList<Track>();
                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);

                @SuppressWarnings("resource")
                FileChannel fileChannel = new RandomAccessFile(String.format(Environment
                        .getExternalStorageDirectory() + "/MyHoviVideo.mp4"),
                        "rw").getChannel();
                out.writeContainer(fileChannel);
                fileChannel.close();

            }catch (FileNotFoundException e){
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }

            //retruning the file after successfull completion of the merging
            String mFileName = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
            mFileName += "/MyHoviVideo.mp4";
            //   = mFileName;
            return mFileName;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            progressDialog.dismiss();
            Log.e("FILE_PATH===",s);
            playVideo(s);

        }
    }

    void playVideo(String play){
        mVideoPlayer.setVideoPath(play);
        mMediaController = new MediaController(this);
        mMediaController.setMediaPlayer(mVideoPlayer);
        mVideoPlayer.setMediaController(mMediaController);
        mVideoPlayer.setBackgroundColor(Color.TRANSPARENT);
        mVideoPlayer.requestFocus();
        mVideoPlayer.start();
    }
Run Code Online (Sandbox Code Playgroud)

有一种方法可以做到,并且在合并之前使音频和高度(分辨率)相等。我一直在寻找FFMPEG,但要在android中实现它却很安静。我需要一个好的解决方案