使用不同的文件扩展名保存一种文件格式。JPG - PNG;电影 - MP4

Rad*_*kov 28 video vlc-media-player filesystems ffmpeg video-conversion

根据经验,我知道如果我.jpg.png扩展名保存文件(反之亦然),大多数程序都会照常打开它。我想知道为什么会这样,并询问有视频编解码器经验的人,如果我尝试将movavi文件另存为会发生什么mp4(完全清楚:通过保存我的意思是,用非对应的扩展名重命名他们的文件名)

如果文件扩展名为 MP4,支持 AVI 和 MOV 的视频播放器是否仍然可以播放文件。

  • 如果是这样,您可以描述在尝试此类播放时可能出现的所有可能问题是什么?
  • 如果不是,为什么?还有为什么这可以通过图像实现?描述您认为与此主题相关的所有技术细节!

谢谢 :)

Ton*_*nny 71

大多数程序根本不查看扩展名。他们查看文件头内容以确定它到底是什么并采取相应的行动。
几乎所有众所周知的标准文件格式在文件的第一个字节中都有可识别的标识。(例如,每个 GIF 图像的前 6 个字节都包含字符“GIF87a”。)
如果软件知道如何处理它,它就会这样做(有些确实会警告扩展名是错误的),如果不知道,它会给出您会收到一条错误消息(或者如果编程不当就会崩溃)。

扩展名主要用作视觉指示器,指示您最有可能是什么文件。
它允许您的操作系统快速确定最适合处理它的应用程序,而无需实际读取文件的内容。

  • 根据我的经验,这*通常*仅适用于二进制格式的文件。你说这也是你的经历吗?我的意思是,文本文件是 JS 文件或仅包含猫名的文件的唯一真实指示是扩展名。有时你必须在知道之前尝试解析和失败。 (11认同)
  • 还有 https://en.wikipedia.org/wiki/File_format#Magic_number (4认同)
  • 一些 gif 以 `GIF89a` 开头 (4认同)
  • @yyny 从技术上讲这是正确的,但对于大多数人来说,“操作系统”和“文件/桌面管理器”之间确实没有区别。事实上:大多数人甚至不知道他们有桌面管理器。我没有不想让答案太复杂:-) (4认同)
  • 为 Windows 划分文件管理器和操作系统是迂腐的——对于大约 99% 的使用 Windows 的人来说,他们的文件管理器是 Windows 资源管理器,对于所有这些人来说,扩展名肯定会影响文件的处理方式。 (4认同)
  • JFYI,https://en.wikipedia.org/wiki/List_of_file_signatures 列出了一些常见的文件格式签名。某些程序,例如 IrfanView,会向用户提供“[filename.ext] 是具有不正确扩展名的 [文件类型]。重命名?” (2认同)
  • @zero298 是的。尤其是文本和各种 xml、html、json 变体总是很棘手。XML 可能有一个 DocType 标头,但对于其他任何东西.... 简单示例:每行 1 个单词的纯文本文件。它只是一个列表还是单列 CSV?显然,这会导致错误的内容被提供给需要其他内容的程序。解决方案正如您所说:尝试解析它,并且(希望)程序足够健壮,不会崩溃并给出合理的错误消息。 (2认同)
  • @Jasen 你是对的。89a 是 gif 标准的第二版。它添加了一些小的补充,主要是为了改进对动画 gif 的处理。大多数动画 gif 应该是 89a。Gif 制作软件经常做错,简单地硬编码将其保存为 87a。(例如,旧版本的 Photoshop 将所有内容都保存为 87,即使它在技术上是 89。这在 Ps v7 或 8 iirc 中已修复。)大多数读者忽略该版本并阅读好像是 89,这是安全的做法,但是会导致 87a 格式的动画 gif 的播放速度错误。 (2认同)

Jör*_*tag 12

更改文件名就是这样做的:更改文件名。而已。特别是更改文件名不会改变文件的内容,只会改变名称,而只会改变名称。

(事实上,更改文件的名称实际上不触及该文件在所有的,因为“名字”实际上只是在目录中的条目,它不与文件相关联。)

由于文件本身的内容没有任何改变,因此在命名Fred时能够正确解码文件内容的程序也能够在命名时正确解码文件内容也就不足为奇了Wilma,原因很简单,内容完全一样

  • @OrangeDog我想OP所说的是文件名与目录条目相关联,而目录条目又与文件相关联。文件名本身并不与文件直接关联,例如,与 Linux 上的 ext4 中的权限、时间戳、所有权等相比,其中两个硬链接可能具有不同的名称,但仍共享其他属性。 (2认同)

Aus*_*arn 6

几乎所有文件格式都在文件开头附近嵌入了有关文件类型的信息。例如,一个真正的 PNG 文件总是以 8 个字节开始0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A(请注意,字节 2 到 4 是 ASCII 字符“PNG”,标题的其余部分是二进制数据,旨在检测正在处理的文件的方式会导致数据损坏)或 ELF 目标文件(用于除 Windows 和 macOS 以外的大多数系统上的可执行文件)以0x7F 0x45 0x4C 0x46(字节 2-4 为 ASCII 中的“ELF” )开头。这些被称为文件签名,虽然它们不是根据内容确定文件类型的唯一方法,但它们通常是第一步。维基百科列出了许多可能感兴趣的常见文件类型

文件签名的使用几乎无处不在,这意味着您可以查看文件本身的内容以确定它是什么类型的文件,几乎所有软件都这样做,原因有两个:

  • 它比匹配文件扩展名(或您从中下载文件的服务器报告的 MIME 类型)要可靠得多,因为您无法修改此数据并且仍然使其成为该类型的有效文件,但您可以更改扩展名(或 MIME 类型)为您想要的任何类型,并且文件不会更改它的类型。
  • 验证文件类型是防止应用程序崩溃或利用其中的错误的重要保护层。如果您盲目地相信有关文件类型的其他信息来源,则您可能会尝试将某些数据解析为一种类型的数据,而实际上它是另一种类型的数据,这可能会导致各种问题。考虑到预期的文件类型,对文件结构的验证不足一直是恶意软件非常常见的攻击媒介。

Windows 在这里主要是异常情况,因为它主要倾向于文件扩展名而不是实际文件内容来决定告诉用户文件类型是什么,而大多数其他系统和大多数应用程序只有在他们无法弄清楚时才回退到文件扩展名通过查看文件内容来确定类型。如今,文件扩展名的唯一实际目的是作为文件类型可能的通用指示器,从而更容易确定您正在处理的文件类型或查找特定类型的文件而无需检查文件内容,尽管在某些情况下人们只是选择检查内容(例如参见fileUNIX 系统命令)。


IMS*_*SoP 6

一般来说,文件扩展名是一种向某些软件提供有关文件内容格式的线索的方式。另一个通常可用的线索是文件本身的内容,它通常在开头包含一个明确的标头用于此目的的文件。

每个软件都可以免费使用这些信息中的一个或两个。一些常见的方法是:

  • 完全忽略文件扩展名,只检查文件内容。
  • 完全忽略文件内容,只看文件扩展名。如果无法按该类型处理文件,则会出错。
  • 查看两者,如果不匹配则警告用户,然后尝试根据文件内容进行处理。
  • 最初查看文件扩展名,并尝试按照该类型进行处理。如果处理失败,警告用户并尝试从内容中猜测类型,甚至询问用户。

因此,更改文件扩展名会对不同的程序产生不同的影响:

  • 它将更改 Windows 资源管理器中的图标和双击操作,并更改 Apache Web 服务器上的下载行为,因为这些程序只查看文件扩展名。
  • 如果该文件对于您选择的文件扩展名无效,则可能会导致某些程序拒绝打开该文件。
  • 如果文件可以被有效地解释为不止一种格式,则更改文件扩展名可能会导致某些程序更改它们的处理方式。

特别是对于视频,大多数文件格式无论如何都是“容器”,因此在文件开头有很多元数据来准确指示它们是如何编码和组装的。因此,与他们合作的软件很可能会采用内容优先的方法,更改扩展名要么没有任何区别,要么发出警告,然后照常进行。