Rotar vídeo con Mp4parser
Necesito girar un video para ajustar algunas de mis necesidades. Voy a explicar los detalles en la siguiente lista.
Estoy creando una aplicación similar a Vine. Tengo que grabar segmentos de video y luego fusionar todas las partes en un solo archivo. Estoy haciendo esto sin problema en una aplicación de Android utilizando la biblioteca de analizador mp4 con la última versión 1.0-RC-26 utilizando el ejemplo proporcionado en su sitio web: aquí
- Grabación de vídeo en Android usando JavaCV (Actualizado 2014 02 17)
- No se puede reproducir este video. Android videoView mp4 grabado por el dispositivo Android
- En Android, usando exoplayer, ¿cómo rellenar surfaceview con un video que no tiene la misma relación de aspecto con el dispositivo?
- Vídeo inverso en android
- Edición de metadatos de un archivo de vídeo en Android
El ejemplo de vídeo adjunto funciona bien si todos los vídeos tienen la misma orientación, pero he descubierto algunos problemas de grabación de vídeo de la cámara frontal por lo que la solución rápida fue establecer la orientación de vídeo de grabación en 270. La parte mala de esta solución es que el segmento con Esta orientación aparece con la orientación incorrecta en el vídeo fusionado.
Mi posible solución a esto es girar el video para aplicar lo que necesito en diferentes situaciones, pero no estoy teniendo un ejemplo de trabajo con mi código. Buscando en internet encontré soluciones como ésta aquí . El problema con este código es que no es compatible con la última versión (da un error de compilación). También intenté entender la lógica de la biblioteca, pero no tengo resultados. Por ejemplo, he experimentado el uso de la instrucción setMatrix
en el objeto de película, pero simplemente no funcionan.
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"); }
¿Alguien ha girado el video con la última versión de Mp4 parser? Inglés no es mi lengua materna así que pido disculpas cualquier error de gramática.
- Reproduce video con canal alfa en Android?
- En Android, es posible guardar vídeo directamente en el servidor Amazon durante la grabación
- Android :: VideoView dentro de un ScrollView
- Los vídeos de Youtube incrustados en la vista Web de Android no se reproducen en el formato SINGLE_COLUMN
- SeekTo en VideoView
- Reproducir video local en la vista web
- Cómo obtener vídeos en GridView desde ** SDCard / carpeta / subcarpeta "
- Cómo manejar la orientación del vídeo desde dispositivos móviles
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; }
Esto es lo que hice para rotar un video.
- Android Maps – Límite de 180 grados
- ¿Cómo saber si estoy conectado correctamente a mi número de salida en Android?