【问题标题】:how to merge the mp4 videos using mp4parser which are taken from both front and back camera alternatively如何使用 mp4parser 合并从前后摄像头交替拍摄的 mp4 视频
【发布时间】:2014-04-13 04:25:35
【问题描述】:

我正在开发一个应用程序来使用 mp4parser 合并 n 个视频。要合并的视频是在前置摄像头和后置摄像头中拍摄的。如果我将这些视频合并为单个视频,则可以很好地合并所有视频,但是通过前置摄像头拍摄的替代视频将被合并为倒置。 我能做些什么。 请任何人帮助我。

这是我合并视频的代码:

try {


String f1,f2,f3;


f1 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo1.mp4";// video took via back camera


f2 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo2.mp4";// video took via front camera


f3 = Environment.getExternalStorageDirectory() + "/DCIM/testvideo3.mp4";// video took via front camera


        Movie[] inMovies = new Movie[] {
          MovieCreator.build(f1),
          MovieCreator.build(f2),
          MovieCreator.build(f3) 
         };
            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);
            WritableByteChannel fc = new RandomAccessFile(
            String.format(Environment.getExternalStorageDirectory()+ "/DCIM/CombinedVideo.mp4"), "rw").getChannel();
            out.writeContainer(fc);                  
            fc.close();

        } catch (Exception e) {
            Log.d("Rvg", "exeption" + e);
            Toast.makeText(getApplicationContext(), "" + e, Toast.LENGTH_LONG)
                    .show();
        }

【问题讨论】:

  • 嗨,Grace Venkat,您解决了这个问题吗?如果您修复了方法,请分享您的想法。我过去三天也面临同样的问题。我会非常感谢你。提前致谢
  • 我也有同样的问题,找不到解决办法
  • 请从我这边分享这个想法同样的问题。
  • 我也遇到了这个问题。如果您找到与此问题相关的任何解决方案,请分享您的解决方案。
  • 嗨,格蕾丝,我尝试了上面的代码,但它显示文件未找到异常,即使我正确获取视频路径,你可以分享代码。

标签: merge rotation mp4parser


【解决方案1】:

说明:

这是由here 解释的方向问题引起的。简而言之,就是因为前置摄像头和后置摄像头录制的视频的旋转元数据不同,使用mp4parser合并视频时,每隔一个视频就会颠倒。

如何解决这个问题:

我设法以两种不同的方式解决了这个问题。

1.重新编码视频 - 使用FFmpeg 我设法以正确的方向合并视频。

How to use,以及我对using FFmpeg in Android的建议

缺点:

这个解决方案的主要问题是它需要将视频重新编码成合并的视频,这个过程可能需要相当长的时间。

由于重新编码,此方法也有损

专业版:

即使视频分辨率、帧率和比特率不同,此方法也可以工作。

2。使用 mp4parser/demuxer 方法 - 为了使用 mp4parser 或 FFmpeg demuxer 方法以正确的方向合并视频,视频必须提供相同的方向 - 或没有旋转元数据。使用 CameraView takeVideoSnapshot() 可以录制没有旋转元数据的视频,因此在将其与 mp4parser 合并时,它的方向正确。

缺点:

此解决方案的主要问题是,要使输出具有正确的方向并且不会失败,输入视频必须具有相同的分辨率、帧速率、比特率以及旋转元数据(为了正确的方向)。

优点:

此方法无需重新编码,因此速度非常快。

它也是无损的。

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 2021-09-05
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多