我想合并两个或多个视频文件(它们可能是两个mp4或两个3gp,或任何其他格式)。
答案 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
答案 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);
}
});
}