[英]How to merge multiple .mp4 file in single .mp4 ffmpeg android
我仅将第一个.mp4正确显示且不显示其他视频后,才将多个.mp4文件合并到单个.mp4中 。
我用了这个ffmpeg
命令
ffmpeg -f concat -i " + strTextPath + " -c copy " + strFinalMergedVideoPath;
首先,将要合并的所有MP4文件存储在Arraylist中,如下所示。
private ArrayList<String> arrFilePaths = new ArrayList<>();
arrFilePaths .add(file1path);
arrFilePaths .add(file2path);
arrFilePaths .add(file3path);
设置输出文件的路径,如下所示。
String strVideoFolderPath = Environment.getExternalStorageDirectory().getAbsolutePath();
之后,在Asynctask类下运行。
public class MergeVideo extends AsyncTask<String, Integer, String> {
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(MotionFlyerTabActivity.this,"",
"Please wait...", true);
// do initialization of required objects objects here
}
@Override
protected String doInBackground(String... params) {
try {
Movie[] inMovies = new Movie[arrFilePaths.size()];
ArrayList<Movie> _clips = new ArrayList<>();
for (int i = 0; i < arrFilePaths.size(); i++) {
inMovies[i] = MovieCreator.build(
arrFilePaths.get(i));
}
List<Track> videoTracks = new LinkedList<>();
List<Track> audioTracks = new LinkedList<>();
for (Movie m : inMovies) {
for (Track t : m.getTracks()) {
if (t.getHandler().equals("soun")) {
audioTracks.add(t);
}
if (t.getHandler().equals("vide")) {
videoTracks.add(t);
}
}
}
Movie result = new Movie();
if (audioTracks.size() > 0) {
result.addTrack(new AppendTrack(audioTracks
.toArray(new Track[audioTracks.size()])));
}
if (videoTracks.size() > 0) {
result.addTrack(new AppendTrack(videoTracks
.toArray(new Track[videoTracks.size()])));
}
BasicContainer out = (BasicContainer) new DefaultMp4Builder()
.build(result);
FileChannel fc = new RandomAccessFile(String.format(strVideoFolderPath + "/output.mp4"), "rw").getChannel();
out.writeContainer(fc);
fc.close();
File file = new File(strVideoFolderPath + "/output.mp4");
String mFileName = file.getAbsolutePath();
return mFileName;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String value) {
super.onPostExecute(value);
progressDialog.dismiss();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.