|
@@ -0,0 +1,105 @@
|
|
|
+package com.ym.utils;
|
|
|
+
|
|
|
+import com.coremedia.iso.boxes.Container;
|
|
|
+import com.googlecode.mp4parser.authoring.Movie;
|
|
|
+import com.googlecode.mp4parser.authoring.Track;
|
|
|
+import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder;
|
|
|
+import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator;
|
|
|
+import com.googlecode.mp4parser.authoring.tracks.AppendTrack;
|
|
|
+import org.apache.commons.io.FileUtils;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.net.MalformedURLException;
|
|
|
+import java.net.URL;
|
|
|
+import java.nio.channels.FileChannel;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.LinkedList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Description 直播视频合并
|
|
|
+ *
|
|
|
+ * @author liujunchi
|
|
|
+ * @date 2022-07-06
|
|
|
+ */
|
|
|
+public class Mp4MergeUtil {
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 合并视频
|
|
|
+ *
|
|
|
+ * @param videoUrlList: 所有视频地址集合
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String mergeVideo(List<String> videoUrlList) throws IOException {
|
|
|
+ FileOutputStream fos = null;
|
|
|
+ FileChannel fc = null;
|
|
|
+ String path = "/var/tmp/mp4";
|
|
|
+ File mergeFile = new File("/var/tmp/mp4/merge.mp4");
|
|
|
+ for (String video : videoUrlList) {
|
|
|
+ File file = new File("/var/tmp/mp4/" + video + ".mp4");
|
|
|
+ FileUtils.copyURLToFile(new URL(video), file);
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ List<Movie> sourceMovies = new ArrayList<>();
|
|
|
+ for (String video : videoUrlList) {
|
|
|
+ sourceMovies.add(MovieCreator.build(video));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Track> videoTracks = new LinkedList<>();
|
|
|
+ List<Track> audioTracks = new LinkedList<>();
|
|
|
+
|
|
|
+ for (Movie movie : sourceMovies) {
|
|
|
+ for (Track track : movie.getTracks()) {
|
|
|
+ if ("soun".equals(track.getHandler())) {
|
|
|
+ audioTracks.add(track);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ("vide".equals(track.getHandler())) {
|
|
|
+ videoTracks.add(track);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Movie mergeMovie = new Movie();
|
|
|
+ if (audioTracks.size() > 0) {
|
|
|
+ mergeMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (videoTracks.size() > 0) {
|
|
|
+ mergeMovie.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
|
|
|
+ }
|
|
|
+
|
|
|
+ Container out = new DefaultMp4Builder().build(mergeMovie);
|
|
|
+ fos = new FileOutputStream(mergeFile);
|
|
|
+ fc = fos.getChannel();
|
|
|
+ out.writeContainer(fc);
|
|
|
+ fc.close();
|
|
|
+ fos.close();
|
|
|
+ return mergeFile.getAbsolutePath();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ if (fc != null) {
|
|
|
+ try {
|
|
|
+ fc.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fos != null) {
|
|
|
+ try {
|
|
|
+ fos.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|