Как сжатие MPEG4 работает?

Обновление: теперь мы также рассматриваем этот вопрос в эпизоде ​​ AskFirebase .

Загрузка многих объектов из Firebase не должна быть медленной, поскольку вы можете конвейерно запросить запросы. Но ваш код делает это невозможным, что действительно приведет к субоптимальной производительности.

В коде вы запрашиваете элемент с сервера, дождитесь возвращения этого элемента, а затем загрузите следующий. В упрощенной диаграмме последовательности, которая выглядит так:

Your app                     Firebase 
                             Database

        -- request item 1 -->
                               S  L
                               e  o
                               r  a
                               v  d
                               e  i
        <-  return item  1 --  r  n
                                  g
        -- request item 2 -->
                               S  L
                               e  o
                               r  a
                               v  d
                               e  i
                               r  n
        <-  return item  2 --     g
        -- request item 3 -->
                 .
                 .
                 .
        -- request item 30-->
                               S  L
                               e  o
                               r  a
                               v  d
                               e  i
                               r  n
                                  g
        <-  return item 30 --

В этом сценарии вы ожидаете 30 раз ваше время в оба конца + 30 раз больше времени, необходимого для загрузки данных с диска. Если (для простоты) мы говорим, что roundtrips занимают 1 секунду, а загрузка элемента с диска также занимает одну секунду, что меньше, чем 30 * (1 + 1) = 60 секунд.

В приложениях Firebase вы если вы отправите все запросы (или, по крайней мере, разумное число из них) за один раз:

Your app                     Firebase 
                             Database

        -- request item 1 -->
        -- request item 2 -->  S  L
        -- request item 3 -->  e  o
                 .             r  a
                 .             v  d
                 .             e  i
        -- request item 30-->  r  n
                                  g
        <-  return item  1 --     
        <-  return item  2 --      
        <-  return item  3 --
                 .
                 .
                 .
        <-  return item 30 --

Если мы снова примем 1-й кругооборот и 1 секунду загрузки, вы ожидаете 30 * 1 + 1 = 31 секунд.

Итак: все запросы проходят через одно и то же соединение. Учитывая это, единственная разница между get(1), get(2), get(3) и getAll([1,2,3]) - это некоторые накладные расходы для кадров.

Я установил jsbin, чтобы продемонстрировать поведение . Модель данных очень проста, но это показывает разницу.

function loadVideosSequential(videoIds) {
  if (videoIds.length > 0) {
    db.child('videos').child(videoIds[0]).once('value', snapshot => {
      if (videoIds.length > 1) {
        loadVideosSequential(videoIds.splice(1), callback)
      }
    });
  }
}

function loadVideosParallel(videoIds) {
  Promise.all(
    videoIds.map(id => db.child('videos').child(id).once('value'))
  );
}

Для сравнения: последовательная загрузка 64 элементов занимает 3,8 секунды в моей системе, а загрузка их конвейерно (так как клиент Firebase выполняется изначально) требуется 600 мс. Точные цифры будут зависеть от вашего соединения (латентность и пропускная способность), но конвейерная версия всегда должна быть значительно быстрее.

18
задан Esteban Küber 29 August 2009 в 22:04
поделиться

3 ответа

MPEG-4 является огромным стандартом и использует много методов для достижения высоких уровней сжатия, к которым это способно.

В целом сжатие видео касается выбрасывания как можно большей информации, имея минимальный эффект на опыт просмотра для конечного пользователя. Например, использование подвыбрало YUV вместо сокращений RGB размер видео в половине немедленно. Это возможно, поскольку человеческий глаз менее чувствителен для окраски, чем это к яркости. В YUV значение Y является яркостью, и U и V значений представляют цвет. Поэтому можно выбросить часть информации о цвете, которая уменьшает размер файла без средства просмотра, замечающего любое различие.

После этого большинство методов сжатия использует в своих интересах 2 дублирования в частности. Первым является временное дублирование, и вторым является пространственное дублирование.

Временное дублирование отмечает, что последовательные кадры в видео последовательности очень похожи. Обычно видео было бы в порядке 20-30 кадров в секунду, и ничего особенного не изменяется в 1/30 секунды. Возьмите любой DVD и приостановите его, затем переместите его в один кадр и отметьте, насколько подобный 2 изображения. Так, вместо того, чтобы кодировать каждый кадр независимо, MPEG-4 (и другие стандарты сжатия) только кодирует различие между последовательными кадрами (использующий оценку движения для нахождения различия между кадрами)

Пространственное дублирование использует в своих интересах то, что в целом цветное распространение через изображения имеет тенденцию быть довольно низкой частотой. Этим я подразумеваю, что соседние пиксели имеют тенденцию иметь схожие цвета. Например, в изображении Вас носящий красную перемычку, все пиксели, которые представляют Вашу перемычку, имели бы очень похожий цвет. Возможно использовать DCT для преобразования пиксельных значений в разнос частот, где некоторая высокочастотная информация может быть выброшена. Затем когда обратный DCT выполняется (во время декодирования), изображение теперь без выброшенной высокочастотной информации.

Для просмотра эффектов выбрасывания высокочастотной информации откройте краску MS и потяните ряд наложения горизонтальных и вертикальных черных линий. Сохраните образ как JPEG (который также использует DCT для сжатия). Теперь увеличьте масштаб шаблона, заметьте, как края строк больше не являются столь же резкими и являются довольно расплывчатыми. Это вызвано тем, что некоторая высокочастотная информация (переход от черного до белого) была выброшена во время сжатия. Считайте это для объяснения с хорошими изображениями

Для дополнительных материалов для чтения эта книга довольно хороша, если немного тяжелый на математике.

36
ответ дан 30 November 2019 в 06:59
поделиться

MPEG4 использует множество методов для сжатия видео.

, Если бы Вы уже не посмотрели на Википедию, это было бы пользой начальная точка .

существует также эта статья от IEEE , который объясняет эти методы более подробно.

1
ответ дан 30 November 2019 в 06:59
поделиться

Как любой другой популярный видеокодек, MPEG4 использует изменение дискретное косинусное преобразование и множество методов компенсации движения (о котором можно думать как прогноз движения, если это помогает), которые уменьшают объем данных, необходимый для последующих кадров. Эта страница имеет обзор того, что сделано простым MPEG4.

Это не полностью отличается от методов, используемых JPEG.

4
ответ дан 30 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: