private void rotateVideoFile(String sourceFilePath, int degree) {
List<TrackBox> trackBoxes = getTrackBoxesOfVideoFileByPath(sourceFilePath);
Movie rotatedMovie = getRotatedMovieOfTrackBox(trackBoxes);
writeMovieToModifiedFile(rotatedMovie);
}
通过mp4parser旋转视频主要分为三步:
(1)获取视频文件对应的TrackBoxes;
(2)根据TrackBoxes获取旋转后的Movie对象;
(3)将Movie对象写入文件。
private List<TrackBox> getTrackBoxesOfVideoFileByPath(String sourceFilePath) {
IsoFile isoFile = null;
List<TrackBox> trackBoxes = null;
try {
isoFile = new IsoFile(sourceFilePath);
trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class);
isoFile.close();
} catch (IOException e) {
e.printStackTrace();
}
return trackBoxes;
}
private Movie getRotatedMovieOfTrackBox(List<TrackBox> trackBoxes) {
Movie rotatedMovie = new Movie();
// 旋转
for (TrackBox trackBox : trackBoxes) {
trackBox.getTrackHeaderBox().setMatrix(Matrix.ROTATE_90);
rotatedMovie.addTrack(new Mp4TrackImpl(trackBox));
}
return rotatedMovie;
}
private void writeMovieToModifiedFile(Movie movie) {
Container container = new DefaultMp4Builder().build(movie);
File modifiedVideoFile = new File(videoFilePath.replace(".mp4", "_MOD.mp4"));
FileOutputStream fos;
try {
fos = new FileOutputStream(modifiedVideoFile);
WritableByteChannel bb = Channels.newChannel(fos);
container.writeContainer(bb);
// 关闭文件流
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
本文对Android视频录制中常见的问题进行了说明,希望对大家的学习有所帮助。
注:相关教程知识阅读请移步到Android开发频道。










