在使用 Java mp4parser 库处理 MP4 文件时,可能会出现 fragment 序列间的不连续性问题。这种问题通常是由于文件中的 timestamps 不是逐帧递增而导致的,这可能会影响视频播放等操作。
要解决此问题,可以使用以下代码示例。首先,通过分析文件中每个 fragment 的起始时间,获取一个表示所有 fragment 的列表。其次,对于每个 fragment,将其起始时间加上前面 fragment 的持续时间,从而获得 fragment 的结束时间。最后,使用修正后的时间戳重新写入文件。
代码示例:
IsoFile isoFile = new IsoFile("input.mp4");
List<FragmentInfo> fragmentInfos = getFragmentInfos(isoFile);
long pts = 0;
for (int i = 0; i < fragmentInfos.size(); i++) {
FragmentInfo fi = fragmentInfos.get(i);
fi.getTrackFragmentBox().setBaseDataOffset(0);
fi.getTrackFragmentHeaderBox().setBaseDataOffset(fi.getTrackFragmentHeaderBox().getBaseDataOffset());
fi.getTrackFragmentHeaderBox().setTrackId(fi.getTrackId());
// Calculate timestamp
if (i > 0) {
FragmentInfo prevFi = fragmentInfos.get(i - 1);
pts += prevFi.getDuration();
}
fi.getTrackFragmentHeaderBox().setBaseMediaDecodeTime(pts);
}
IsoFile outFile = new IsoFile("output.mp4");
outFile.addBox(isoFile.getMovieBox());
outFile.write();
private List<FragmentInfo> getFragmentInfos(IsoFile isoFile) {
List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class);
List<FragmentInfo> fragmentInfos = new ArrayList<>();
for (TrackBox trackBox : trackBoxes) {
List<TrackFragmentBox> trackFragmentBoxes = trackBox.getBoxes(TrackFragmentBox.class);
for (TrackFragmentBox trackFragmentBox : trackFragmentBoxes) {
TrackFragmentHeaderBox tfhd = trackFragmentBox.getTrackFragmentHeaderBox();
FragmentInfo fragmentInfo = new