【问题标题】:How to concat or merge two or more video files in Android?如何在 Android 中连接或合并两个或多个视频文件?
【发布时间】:2012-11-22 13:59:47
【问题描述】:

我想合并两个或多个视频文件(它们可能是两个 mp4 或两个 3gp 或任何其他格式)。

【问题讨论】:

  • ffmpeg 是一个很棒的库,可以处理视频转换等等。这里有一个 java 绑定:code.google.com/p/jjmpeg
  • 我使用 FileInputSream 来获取 srouce 文件,然后使用 SequenceInputStream(stream1,stream2) 来合并两个文件,但它认为这不适用于视频文件,如果出现内存泄漏问题,android 也会出现问题堆大小扩展超过 16MB

标签: java android video


【解决方案1】:

您可以使用的最通用的工具是 ffmpeg(如上面@Jeremy 所述),但在手机上使用它需要一些工作;它也是 LGPL 许可的,它的一些编码器(特别是 x264)是 GPL。

如果您要连接的两个文件都使用相似的编码,并且包含在源自 MP4 的文件格式(3GP 就是这样)中,一个更简单的解决方案是使用纯 Java MP4 解析器并连接视频而不触及媒体流本身。看看mp4parser,这是一个纯Java 的开源解析器,在Apache 许可下获得许可,甚至在其wiki 中有一个example for concatenating videos

【讨论】:

  • cool ,mp4 解析器适用于 2 个文件,但它不能正常工作超过 2 个文件,视频没有正确合并。它是否同时适用于 2 个以上的文件?
  • @Mahesh 合并两个文件,然后将合并后的文件与下一个合并,以此类推?
  • @Cheesebaron 你说的这可能吗?
【解决方案2】:

你可以试试INDE Media for Mobile,教程在这里:https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials

它在 MediaComposer 类中具有转码\remuxing 功能,并且可以加入文件\文件段。由于它使用 MediaCodec API,内部编码是在 GPU 上完成的,因此非常电池友好并且工作速度尽可能快。

显示如何启用加入或其他功能的示例代码在 github 上:https://github.com/INDExOS/media-for-mobile

【讨论】:

    【解决方案3】:

    我将分享 Java 和 Kotlin 代码

    在内部它使用 FFmpeg,但它是轻量级的。添加两个不同类型或编解码器、帧率和比特率的视频的最简单方法是使用 EpMedia 库。

    等级依赖性

    implementation 'com.github.yangjie10930:EpMedia:v0.9.5'
    

    Kotlin 代码

        val epVideos = ArrayList<EpVideo>()
        epVideos.add(EpVideo("/storage/emulated/0/Contact/1.mp4")) // Video 1 Example
        epVideos.add(EpVideo("/storage/emulated/0/Contact/2.mp4")) // Video 2 Exmaple
        val outputOption = EpEditor.OutputOption ("/storage/emulated/0/merge.mp4"); //Output
        outputOption.setWidth(720) // output video width, default 480
        outputOption.setHeight(1280)
        outputOption.frameRate =  25 ; // output video frame rate, default 30
    
        EpEditor.merge(epVideos,outputOption,object:OnEditorListener{
            override fun onSuccess() {
    
            }
    
            override fun onFailure() {
    
            }
    
    
            override fun onProgress(progress: Float) {
                Log.d("Progress","$progress")
            }
    
        })
    

    Java 代码

     private void mergeVideos() {
        ArrayList<EpVideo> epVideos =  new  ArrayList<>();
        epVideos.add(new EpVideo (file2)); // Video 1
        epVideos.add(new EpVideo (file1)); // Video 2
        EpEditor. OutputOption outputOption =new EpEditor.OutputOption(fileOutput);
        outputOption.setWidth(720);
        outputOption.setHeight(1280);
        outputOption.frameRate = 25 ;
        outputOption.bitRate = 10 ;
        EpEditor.merge(epVideos, outputOption, new  OnEditorListener() {
            @Override
            public  void  onSuccess () {
                Log.d("Status","Success");
    
            }
    
            @Override
            public  void  onFailure () {
    
            }
    
            @Override
            public  void  onProgress ( float  progress ) {
                // Get processing progress here
                Log.d("Progress",""+progress);
            }
        });
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2023-03-10
      • 2019-08-12
      • 1970-01-01
      • 2013-06-15
      • 2010-11-11
      相关资源
      最近更新 更多