我首先合并后,将多个.mp4文件合并为单个.mp4 。正确显示.mp4并且不显示其他视频。
我使用了这个ffmpeg
命令
ffmpeg -f concat -i " + strTextPath + " -c copy " + strFinalMergedVideoPath;
答案 0 :(得分:0)
首先存储要在Arraylist中合并的所有MP4文件,如下所示。
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();
}
}