2013-10-04 3 views
6

Мне нужно повернуть видео, чтобы настроить некоторые из моих потребностей. Я объясню детали в следующем списке.Поворот видео с помощью 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? Английский не мой родной язык, поэтому я извиняюсь за любую грамматическую ошибку.

ответ

4
for (int i = 1; i <= SegmentNumber; i++) { 

    IsoFile isoFile = new IsoFile(getCompleteFilePath(i)); 
    Movie m = new Movie(); 

    List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(
    TrackBox.class); 

    for (TrackBox trackBox : trackBoxes) { 
     trackBox.getTrackHeaderBox().setMatrix(Matrix.ROTATE_90); 
     m.addTrack(new Mp4TrackImpl(trackBox)); 
    } 

    inMovies[i - 1] = m; 
} 

Это то, что я сделал для поворота видео.

+0

Как-то isoFile.getMovieBox() всегда возвращает null для меня, связано ли это с форматом файла? Iso-тип мудрый ..? – Nativ

+1

Он работает! Спасибо, Келли! Это единственный и окончательный ответ. –

+1

Привет, У меня есть успех, чтобы повернуть, но есть некоторые проблемы. Если я пытаюсь повернуть первый фильм в ROTATE_90 и второй фильм в ROTATE_270, тогда ... второй фильм не ROTATE_270, а его ротатор ROTATE_90. У вас есть решение для этого ...? – Kalpesh

Смежные вопросы