MP4解析器中的延时摄影帧率

13

我试图摄取一个mp4文件并将它变成时间流逝的视频。下面附有代码可以实现这一点。然而,输出文件的帧速率是16*originalFrameRate。因为我不想将其作为慢动作视频播放,所以我更愿意删除那些多余的帧,使输出文件更小。

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分钟内播放一个16分钟的视频?如果是这样,那么你如何决定要丢弃哪些帧?因为丢失一帧意味着你会在转换中出现故障。 - Tarun Lalwani
我假设时间间隔没有平滑的过渡,对吗?我只想保留每16个连续帧中的1个。 - Kirill Kulakov
1
阅读他们的存储库上的内容“从电影中创建JPEG。不,这不是解码器。MP4解析器不知道如何做到这一点。从JPEG创建电影”,我有一种感觉,他们不支持您所要求的内容。 - Tarun Lalwani
1个回答

0

如@tarun-lalwani所述,如果您所指的项目是https://github.com/sannies/mp4parser,那么它只能编辑MP4容器,而不能编辑容器中包含的视频/音频/媒体等。即使您可以使用元数据将FPS加速16倍,文件大小也不会变小,因为所有帧仍然在文件中(只是显示时间更短)。您需要使用类似FFmpeg(例如通过https://github.com/bramp/ffmpeg-cli-wrapper)或其他编程视频编辑器来实现您所描述的内容,从而仅保留每个第十六帧的视频,以便视频文件实际上变得更小。

简而言之,mp4parser不是用于编辑视频(而不是元数据)的正确项目,您想要实现的目标似乎超出了仅仅调整容器的范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接