JS 检测到一个特定的 .mp4 文件的宽度和高度错误

Ste*_*ota 5 javascript video angular

我的问题是 JavaScript 报告了一个特定mp4文件的错误宽度和高度。

这是我用来找出视频宽度和高度(简化)的代码:

// loadedmetadata event of video element
onLoadedMetadata(event) {
  videoWidth = event.srcElement.videoWidth;
  videoHeight = event.srcElement.videoHeight;
}
Run Code Online (Sandbox Code Playgroud)

我不确定文件的元数据是否有问题,但它变得更有趣:

  1. UNIX 系统正确识别宽度和高度 (607x1080)
  2. Windows 无法正确识别宽度和高度 (1080x1080)
  3. 两个平台(Windows 和 Mac)上的 Chrome 都无法正确识别宽度和高度 (1080x1920)

这是我创建的快速演示(此代码可以正确识别我尝试过的所有视频的宽度和高度,除了这个):

https://stackblitz.com/edit/angular-7ooyic

在这里,您可以下载导致问题的视频文件:

https://share.getcloudapp.com/Jru70Lgl

在此先感谢您对解决这个谜团的任何帮助!

sza*_*ary 4

UNIX 系统正确识别宽度和高度 (607x1080)

Windows 错误识别宽度和高度 (1080x1080)

你准备好了吗?两者都是正确的,一种是错误的,取决于你对礼与错的定义。

运行这个命令: MP4Box -diso -std ezpz-Retargeting-Stories-Tiny-Cup_Spoon.mp4 2>&1 | less

你会看见:

<TrackHeaderBox CreationTime="3662746977" ModificationTime="3662746977" TrackID="1" Duration="20020" Width="607.50" Height="1080.00">

<AVCSampleEntryBox DataReferenceIndex="1" Width="1080" Height="1080" XDPI="4718592" YDPI="4718592" BitDepth="24">

你看,有编解码器和容器。把它想象成一封信和一个信封。信封内可包含多封信件。信封外面可能有一个地址,但当你打开它时,信件有一个不同的地址。

MP4 是一个可以包含多个字母的信封。例如,它可能有音轨、视频轨、文本轨、数据轨等。它们是独立的东西,但它们组合成同一个文件(信封)。

在本例中,容器 (mp4/envelope) 表示分辨率为607.5x1080( TrackHeaderBox)。但是(编解码器)里面的字母说分辨率是1080x1080AVCSampleEntryBox)。那么哪个是正确的呢?

Windows(正确)将宽度和高度识别为 1080x1080(根据编解码器),UNIX(正确)将宽度和高度识别为 607x1080(根据容器)。区别在于,当您遇到相互矛盾的信息时,您希望相信什么是事实来源。

在这种具体情况下,我个人认为 Windows 比 Unix 更正确,因为解码器是比渲染阶段更好的事实来源。

太长了。文件坏了。修复文件,使编解码器和容器匹配。欢迎观看互联网视频!