12

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

4

3 回答 3

14

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

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

于 2012-11-22T15:13:44.683 回答
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

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

于 2015-01-20T15:50:03.843 回答
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);
        }
    });

}
于 2020-02-25T15:43:09.413 回答