3

我想知道是否有可能使用 Windows 和 c++ 获取一个大型视频文件(长度为几千兆字节)并“就地”删除它的前几百兆字节和最后几百兆字节。

将有用数据复制到新文件的传统方法通常需要 20 分钟以上看似不必要的复制。

有什么聪明的东西可以用磁盘在低级别完成以实现这一点吗?

4

5 回答 5

6

当然,理论上是可以的。但是,如果您的文件系统是 NTFS,请准备好花几个月的时间来了解您需要更新的所有数据结构。(所有这些都是官方无证的顺便说一句。)

此外,您还需要

  1. 以某种方式卸载卷并进行更改;或者
  2. 了解如何编写内核文件系统驱动程序、从 MS 购买许可证、开发驱动程序并使用它来更改实时文件系统。

如果您的文件系统是 FAT32 之类的更简单的文件系统,这会更容易一些。但无论哪种方式:简而言之,这可能是可能的,但即使是这样,你的生命也会花费数年时间。我的建议:不要打扰。

相反,看看你可以解决问题的其他方法:例如,通过使用avisynth脚本来只提供来自你感兴趣的区域的帧。

于 2009-04-11T20:23:34.580 回答
4

您是否希望只是在目录条目中摆弄扇区地址?几乎无法想象这个计划会奏效。

首先,它要求您希望删除的数据量恰好是扇区大小。考虑到一开始可能有一些标题数据必须保留在那里,这不太可能。

即使它满足这些要求,也需要进行低级修改,Windows 会非常努力地阻止您这样做。

于 2009-04-11T20:17:52.520 回答
2

也许您的文件格式允许“跳过”字节,以便您可以简单地覆盖(即使用内存映射)必要的部分。当然,这仍然会不必要地占用大量磁盘空间。

于 2009-04-11T20:32:45.900 回答
2

Yes, you can do this, on NTFS.

The end you remove with SetFileLength.

The beginning, or any other large consecutive region of the file, you overwrite with zeros. You then mark the file "sparse", which allows the file system to reclaim those clusters.

Note that this won't actually change the offset of the data relative to the beginning of the file, it only prevents the filesystem from wasting space storing unneeded data.

于 2011-05-11T01:54:31.903 回答
1

Even if low level filesystem operations were easy, editing a video file is not simply a matter of deleting unwanted megabytes. You still do have to consider concepts such as compression, frames, audio and video muxing, media file containers, and many others...

Your best solution is to simply accept your idle twenty minutes.

于 2009-04-11T20:41:47.953 回答