我尝试使用MP4Parser(或任何其他方法,如果您知道其中一个)将当前正在使用TrackHeaderBox旋转的横向视频旋转为肖像,但根本无法获得更改的方向,是否有人在此之前使用过可以发现我可能犯的错误吗?任何帮助都会有很长的路要走,谢谢
IsoFile out = new DefaultMp4Builder().build(result);
// test
double[] m = null;
m = new double[] { 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0 };
TrackBox tb = out.getMovieBox().getBoxes(TrackBox.class).get(0);
TrackHeaderBox box = tb.getTrackHeaderBox();
box.setMatrix(m);
答案 0 :(得分:0)
您真的在改变视频轨道的方向吗?如果更改音轨的方向,则不会看到任何更改。
根据我的经验,更改整个文件的方向更容易(1.0.4.2 API版本):
Movie result = MovieCreator.build("input.mp4");
// do something with the file
Container out = new DefaultMp4Builder().build(result);
MovieHeaderBox mvhd = Path.getPath(out, "moov/mvhd");
mvhd.setMatrix(Matrix.ROTATE_180);
out.writeContainer(new FileOutputStream("result.mp4").getChannel());
或者,如果您想直接更改方向而不通过Movie
对象:
IsoFile isoFile = new IsoFile("video.mp4");
MovieHeaderBox mvhd = Path.getPath(isoFile, "/moov/mvhd");
mvhd.setMatrix(Matrix.ROTATE_180);
isoFile.writeContainer(new FileOutputStream("result.mp4").getChannel());
文件result.mp4
现在旋转180度,您可以通过在桌面播放器(如QuickTime或VLC)中播放文件进行验证。
当您在VideoView的帮助下在Android上播放视频时,您可能会注意到矩阵未被考虑在内。我不完全确定这是否是故意的,但解决方法是使用应用转换的TextureView
。
为了做到这一点,你必须
setScaleX
,setScaleY
,setPivotX
,setPivotY
和setRotation
。答案 1 :(得分:0)
@Sebastian提出的解决方案仅受到少数媒体参与者的尊重。其次,诸如Exiftool和MediaInfo之类的工具无法正确地对此进行解析。
mp4Parser维护者发布的帖子here暗示人们应该使用'/ moov / trak / tkhd'而不是'/ moov / mvhd'
以下示例将使文件旋转正确。
IsoFile isoFile = new IsoFile(srcVideo.getAbsolutePath());
FileOutputStream fileOutputStream = new FileOutputStream(destVideo.getAbsolutePath());
FileChannel channel = fileOutputStream.getChannel()
TrackHeaderBox thb = Path.getPath(isoFile, "/moov/trak/tkhd");
thb.setMatrix(Matrix.ROTATE_90);
isoFile.writeContainer(channel);