Как объединить или объединить два или более видеофайлов в Android?

Я хочу объединить два или более видеофайлов (это может быть два mp4 или два 3GP, или любой другой формат).

2 ответа

Решение

Самый общий инструмент, который вы можете использовать, - это ffmpeg (как отмечено выше @Jeremy), но использование его на мобильном телефоне потребует некоторой работы; Кроме того, он лицензирован LGPL и некоторые из его кодеров (в частности, x264) являются GPL.

Более простое решение, если оба файла, которые вы хотите объединить, используют одинаковую кодировку и содержатся в форматах файлов, полученных из MP4 (например, 3GP), состоит в том, чтобы использовать синтаксический анализатор MP4 с чисто java и объединять видео, не касаясь самого потока мультимедиа., Взгляните на mp4parser, синтаксический анализатор с открытым исходным кодом, который является чисто java, лицензирован под лицензией Apache и даже имеет пример объединения видео в своей вики.

Я поделюсь кодом 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);
        }
    });

}

Вы можете попробовать INDE Media для мобильных устройств, учебные руководства находятся здесь: https://software.intel.com/en-us/articles/intel-inde-media-pack-for-android-tutorials

Он имеет функцию перекодировки \ ремикширования в классе MediaComposer и возможность объединения сегментов файл \ файл. Поскольку он использует API-интерфейс MediaCodec, внутреннее кодирование выполняется на графическом процессоре, поэтому оно очень экономно расходует заряд аккумулятора и работает максимально быстро.

Пример кода, показывающий, как включить объединение или другие функции, находится на github: https://github.com/INDExOS/media-for-mobile

Другие вопросы по тегам