mp4解析时间拍帧速率

2022-09-04 23:34:37

我正在尝试摄取一个mp4文件并使其成为延时摄影。它适用于下面附带的代码。但是,输出文件的帧速率为 。由于我不打算将其作为视频播放,因此我宁愿删除这些冗余帧以使输出文件变小。16*originalFrameRateslow motion

Movie inputMovie = MovieCreator.build(fileUri);

List<Track> videoTracks = new LinkedList<>();

for (Track track : inputMovie.getTracks()) {
    if (track.getHandler().equals("vide")) {
        videoTracks.add(track);
    }
}

final int speedByFactorOf = 16;

Movie outputMovie = new Movie();

AppendTrack appendedTracks = new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()]));
outputMovie.addTrack(new WrappingTrack(appendedTracks) {
    @Override
    public long[] getSampleDurations() {
        long[] l = super.getSampleDurations();
        for (int i = 0; i < l.length; i++) {
            l[i] /= speedByFactorOf;
        }
        return l;
    }
});

BasicContainer out = (BasicContainer) new DefaultMp4Builder().build(outputMovie);

FileChannel fc = new RandomAccessFile("timelapse.mp4", "rw").getChannel();
out.writeContainer(fc);
fc.close();
out.close();

我无法找到任何如何更改输出帧速率的示例。


答案 1

正如@tarun-lalwani所说,如果您引用的项目 https://github.com/sannies/mp4parser 那么它只能编辑MP4容器,而不能编辑容器内保存的视频/音频/媒体等。即使您可以使用元数据将 FPS 加速 16 倍,文件大小也不会变小,因为所有帧仍将位于文件中(只是在较短的持续时间内显示)。您需要使用像FFmpeg之类的东西(例如通过 https://github.com/bramp/ffmpeg-cli-wrapper)或其他一些编程视频编辑器来执行您所描述的操作,从而仅保留每十六帧视频,因此视频文件实际上会变小。

TLDR;mp4parser不是用于编辑视频(而不是元数据)的正确项目,您想要实现的内容听起来超出了摆弄容器的范围。


答案 2

推荐