Мне нужно повернуть видео, чтобы настроить некоторые из моих потребностей. Я объясню детали в следующем списке.Поворот видео с помощью Mp4parser
Я создаю такое приложение, как Vine. Я должен записывать сегменты видео, а затем объединять все части только в один файл. Я делаю это без проблем в Android-приложении, используя библиотеку парсера mp4 с последней версией 1.0-RC-26, используя пример, представленный на их веб-сайте: here
Пример добавления видео работает отлично, если все видео имеют одинаковую ориентацию но я обнаружил некоторые проблемы с записью видео с передней камеры, поэтому быстрым решением было установить запись видеозаписи на 270. Плохая часть этого решения заключается в том, что сегмент с этой ориентацией отображается с неправильной ориентацией на объединенном видео.
Мое возможное решение для этого - повернуть видео, чтобы применить то, что мне нужно в разных ситуациях, но у меня нет рабочего примера с моим кодом. Поиск в Интернете Я нашел такие решения, как этот here. Проблема с этим кодом заключается в том, что он несовместим с последней версией (он дает ошибку компиляции). Я тоже пытался понять логику библиотеки, но у меня нет результатов. Например, я экспериментировал с использованием инструкции setMatrix
объекта Movie, но это просто не работает.
public static void mergeVideo(int SegmentNumber) throws Exception {
Log.d("PM", "Merge process started");
Movie[] inMovies = new Movie[SegmentNumber] ;
//long[] Matrix = new long[SegmentNumber];
for (int i = 1 ; i <= SegmentNumber; i++){
File file = new File(getCompleteFilePath(i));
if (file.exists()){
FileInputStream fis = new FileInputStream(getCompleteFilePath(i));
//Set rotation I tried to experiment with this instruction but is not working
inMovies [i-1].setMatrix(Matrix.ROTATE_90);
inMovies [i-1] = MovieCreator.build(fis.getChannel());
Log.d("PM", "Video " + i + " merged");
}
//fis.close();
}
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
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()])));
}
Container out = new DefaultMp4Builder().build(result);
//out.getMovieBox().getMovieHeaderBox().setMatrix(Matrix.ROTATE_180); //set orientation, default merged video have wrong orientation
// Create a media file name
//
String filename = getCompleteMergedVideoFilePath() ;
FileChannel fc = new RandomAccessFile(String.format(filename), "rw").getChannel();
out.writeContainer(fc);
fc.close();
//don't leave until the file is on his place
File file = new File (filename);
do {
if (! file.exists()){
Log.d("PM", "Result file not ready");
}
} while (! file.exists());
//
Log.d("PM", "Merge process finished");
}
Есть ли у кого-то вращающееся видео с самой последней версией парсера Mp4? Английский не мой родной язык, поэтому я извиняюсь за любую грамматическую ошибку.
Как-то isoFile.getMovieBox() всегда возвращает null для меня, связано ли это с форматом файла? Iso-тип мудрый ..? – Nativ
Он работает! Спасибо, Келли! Это единственный и окончательный ответ. –
Привет, У меня есть успех, чтобы повернуть, но есть некоторые проблемы. Если я пытаюсь повернуть первый фильм в ROTATE_90 и второй фильм в ROTATE_270, тогда ... второй фильм не ROTATE_270, а его ротатор ROTATE_90. У вас есть решение для этого ...? – Kalpesh