如何在Android中连接或合并两个或多个视频文件?

时间:2012-11-22 13:59:47

标签: java android video

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

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:5)

您可以尝试使用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

enter image description here enter image description here enter image description here

答案 2 :(得分:2)

我将同时共享Java和Kotlin代码

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

成绩依赖性

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

科林代码

    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);
        }
    });

}