4

我正在尝试使用当前正在使用 TrackHeaderBox 播放但根本无法改变方向的 MP4Parser(或任何其他方法,如果您知道的话)将横向视频旋转成纵向,有没有人在此之前使用过它可以发现我可能犯的错误?任何帮助都会有很大帮助,谢谢

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);
4

2 回答 2

0

在 MP4 中嵌入有关旋转的信息

你真的在改变视频轨道的方向吗?如果您更改音轨的方向,您将看不到任何变化。

根据我的经验,更改整个文件的方向更容易(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 等桌面播放器中播放文件来验证。

Android上的典型问题

当您借助 VideoView 在 Android 上播放视频时,您可能会注意到未考虑矩阵。我不完全确定这是否是故意的,但解决方法是使用TextureView应用转换的 a 。

为此,您必须

  • 从 /moov/mvhd 的 MovieHeaderBox 和 /moov/trak[0, 1, 2, 3]/tkhd 的 MediaHeaderBox 提取矩阵(取决于哪个 trak 包含视频)。
  • 通过矩阵乘法合并两个矩阵。
  • 根据上一步生成的矩阵调用、setScaleXsetScaleYsetPivotXsetPivotYsetRotation
于 2013-06-30T21:42:11.570 回答
0

@Sebastian 提出的解决方案仅受到少数媒体播放器的尊重。其次,Exiftool 和 MediaInfo 等工具无法正确解析此内容。

mp4Parser维护者的帖子暗示应该使用“/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);
于 2019-10-29T12:10:41.000 回答