JS обнаруживает неправильную ширину и высоту для одного конкретного файла .mp4 - PullRequest
5 голосов
/ 05 февраля 2020

Моя проблема в том, что JavaScript сообщает о неправильной ширине и высоте для одного конкретного mp4 файла.

Этот код я использую для определения ширины и высоты видео (упрощенно):

// loadedmetadata event of video element
onLoadedMetadata(event) {
  videoWidth = event.srcElement.videoWidth;
  videoHeight = event.srcElement.videoHeight;
}

Я не уверен, что с метаданными файла что-то не так, но это становится более интересным:

  1. UNIX системы распознают ширину и высоту ПРАВИЛЬНО (607x1080)
  2. Windows распознает ширину и высоту НЕПРАВИЛЬНО (1080x1080)
  3. Chrome на обеих платформах (Windows и Ma c) распознает ширину и высоту НЕПРАВИЛЬНО (1080x1920)

Вот быстро DEMO Я создал (этот код правильно распознает ширину и высоту для всех видео, которые я пробовал, кроме этого):

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

И здесь, и вы можете скачать видео файл, который вызывает проблемы:

https://share.getcloudapp.com/Jru70Lgl

Заранее благодарен за любую помощь в разрешении этой тайны!

1 Ответ

4 голосов
/ 06 февраля 2020

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 - конверт, который может содержать несколько букв. Например, он может содержать аудиодорожки, видеодорожки, текстовые дорожки, дорожки данных и т. Д. c. Это отдельные вещи, но они объединены в один файл (конверт).

В этом случае контейнер (mp4 / envelope) сообщает, что разрешение равно 607.5x1080 (TrackHeaderBox). Но письмо внутри (код c) говорит о том, что разрешение 1080x1080 (AVCSampleEntryBox). Так что же правильно?

Windows (ПРАВИЛЬНО) распознает ширину и высоту как 1080x1080 (согласно коду c), а UNIX (ПРАВИЛЬНО) распознает ширину и высоту как 607x1080 (согласно контейнеру) ). Разница в том, что ВЫ хотите доверять как источнику истины, когда им предоставляют противоречивую информацию.

В этом конкретном случае c, я лично считаю, что windows более верен, чем Unix в этом декодер - лучший источник правды, чем этап рендеринга.

TLDR. Файл плохой. Исправьте файл так, чтобы код c и контейнер соответствовали. Добро пожаловать на видео на inte rnet!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...