将MPEG4视频与MP4解析器结合使用 - Android 产生静止画面视频

6

我使用mp4Parser isoviewer-1.0-RC-35.jar 合并由Android MediaRecorder录制的剪辑。通过侦听音轨,剪辑似乎被正确地合并,但是视频仅停留在一个帧上,并且播放时代码时间保持为零。

在创建单个剪辑时的Media Recorder代码

mediaRecorder = new MediaRecorder();

        myCamera.lock();

        myCamera.unlock();

        String clipLocation = file.getAbsolutePath();
        _moviePaths.add(clipLocation);
        // Please maintain sequence of following code.

        // If you change sequence it will not work.
        mediaRecorder.setCamera(myCamera);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

        if (facingBack) {
            mediaRecorder.setOrientationHint(90);
        } else {
            mediaRecorder.setOrientationHint(270);
        }

        // Log.v("cam","supported vid sizes: "+
        // myCamera.getParameters().getSupportedVideoSizes());
        CamcorderProfile profile = CamcorderProfile
                .get(CamcorderProfile.QUALITY_720P);

        // mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
         //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        // mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setMaxDuration(g.kMaxVideoDurationInMiliseconds);// 15seconds
        mediaRecorder.setProfile(profile);
        mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
        mediaRecorder.setOutputFile(path + filename);
        mediaRecorder.prepare();
        startTimer();
        mediaRecorder.start();

    }

我使用的合并剪辑的方法:

protected void combineClips() throws IOException{

        for(int i=0; i<_moviePaths.size();i++){

                Movie tm = MovieCreator.build(_moviePaths.get(i));
                _clips.add(tm);

        }

         List<Track> videoTracks = new LinkedList<Track>();
         List<Track> audioTracks = new LinkedList<Track>();

            for (Movie m : _clips) {
                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();
            Log.v("cam", "adding:"+audioTracks.size()+" audio tracks and "+videoTracks.size()+" video tracks");
            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()])));
            }

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

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

    }
1个回答

7

显然,问题与库有关:isoviewer-1.0-RC-35.jar。我将其替换为isoviewer-1.0-RC-27.jar,现在一切都很好!


谢谢,解决了我的问题,绝对值得点赞。但是你有没有注意到,在最终输出的mp4文件中,当我们从一个视频切换到另一个视频时会出现空白屏幕...你有没有找到克服这个问题的方法? - Ravinder Bhandari
@erik,当将前置录制的视频和后置录制的视频合并成单个文件时,输出文件显示不同的旋转。如何将两个视频的旋转调整为相同?我已经苦苦挣扎了三天,请帮帮我。 - Murali Ganesan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接