如何在安卓设备中合并两个或多个视频文件?

12

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


2
FFmpeg是一个处理视频转换等方面的优秀库。这里有一个Java绑定:http://code.google.com/p/jjmpeg/。 - appnus
我使用了FileInputStream来获取源文件,然后使用SequenceInputStream(stream1,stream2)来合并两个文件,但我认为这不是处理视频文件的正确方式,而且如果堆大小超过16MB,Android会出现内存泄漏问题。 - Mahesh
3个回答

14

您可以使用最通用的工具ffmpeg(如上所述,由@Jeremy指出),但在移动设备上使用它需要一些工作;此外,它是LGPL许可证并且其中一些编码器(特别是x264)是GPL。

如果您要连接的两个文件使用相似的编码,并且包含在源自MP4的文件格式中(3GP就是这样),那么更简单的解决方案是使用纯Java MP4解析器,在不触摸媒体流本身的情况下连接视频。看一下mp4parser,一个开源解析器,是纯Java的,根据Apache许可证进行许可,甚至在其维基上有一个连接视频的示例


酷,MP4解析器适用于2个文件,但是对于超过2个文件,它无法正常工作,视频无法正确合并。它能同时处理超过2个文件吗? - Mahesh
@Mahesh 合并两个文件,然后将合并后的文件与下一个文件合并,以此类推? - Cheesebaron
@Cheesebaron,您所说的这个可能吗? - Udit Kumawat

5

5

我将分享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);
        }
    });

}

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