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

Javascript JS为一个特定的.mp4文件检测到错误的宽度和高度,javascript,angular,video,Javascript,Angular,Video,我的问题是JavaScript报告了一个特定的mp4文件的错误宽度和高度 这是我用来找出视频宽度和高度的代码(简化): 我不确定文件的元数据是否有问题,但更有趣的是: UNIX系统正确识别宽度和高度(607x1080) Windows无法正确识别宽度和高度(1080x1080) 两种平台(Windows和Mac)上的Chrome都无法正确识别宽度和高度(1080x1920) 下面是我创建的quick演示(此代码正确识别除此之外我尝试过的所有视频的宽度和高度): 在这里,您可以下载导致问题的视频

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

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

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

  • UNIX系统正确识别宽度和高度(607x1080)
  • Windows无法正确识别宽度和高度(1080x1080)
  • 两种平台(Windows和Mac)上的Chrome都无法正确识别宽度和高度(1080x1920)
  • 下面是我创建的quick演示(此代码正确识别除此之外我尝试过的所有视频的宽度和高度):

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

    提前感谢您对解开这个谜团的任何帮助

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

    Windows无法正确识别宽度和高度(1080x1080)

    你准备好了吗?两者都是正确的,一个是错误的,这取决于你对仪式和错误的定义

    运行以下命令:
    MP4Box-diso-std ezpz-Retargeting-Stories-Tiny-Cup|u Spoon.mp4 2>&1| less

    你会看到:

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

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

    在这种情况下,容器(mp4/信封)表示分辨率为
    607.5x1080
    TrackHeaderBox
    )。但是里面的字母(编解码器)说分辨率是
    1080x1080
    AVCSampleEntryBox
    )。那么哪一个是正确的呢

    Windows(正确)将宽度和高度识别为1080x1080(根据编解码器),UNIX(正确)将宽度和高度识别为607x1080(根据容器)。不同之处在于,当面对相互冲突的信息时,你希望信任什么作为真相的来源

    在这种情况下,我个人认为windows比Unix更正确,因为解码器比渲染阶段更能反映真实情况


    TLDR。文件坏了。修复文件,使编解码器和容器匹配。欢迎来到网上视频

    在我的Windows计算机上,警报报告:videoWidth:1080,videoHeight:1920@rickz是的,我也很抱歉弄错了。我更正了。非常感谢视频虚拟友好的回答!我明白现在的问题是什么,但仍然有一件事困扰着我。你知道为什么Unix和Windows上的JS都会报告视频分辨率为1080x1920吗?JS(在本例中)什么都不知道,它依赖浏览器来报告。不同的浏览器是由不同的人编写的,不同的人有不同的观点。好吧,所以我尝试了Mozilla和Chrome,两种浏览器都报告了1080x1920。我只是对1920的高度值感到惊讶,这是这个视频在其他任何地方都看不到的值。
    // loadedmetadata event of video element
    onLoadedMetadata(event) {
      videoWidth = event.srcElement.videoWidth;
      videoHeight = event.srcElement.videoHeight;
    }