Usun Usun
6 min readJan 23, 2016

Синхронизация звука в Coub (январь 2016 / обновлено в апреле 2016 / июле 2016)

статья устарела, вот ее более новая версия: https://medium.com/@usunusun/%D0%BF%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-coub-%D0%B8-%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B7%D0%B2%D1%83%D0%BA%D0%B0-%D1%81%D0%B5%D0%BD%D1%82%D1%8F%D0%B1%D1%80%D1%8C-2016-df1bafecc7f2#.iwvnlydls

ВВЕДЕНИЕ
Точная синхронизация между аудио и видео в коубе давно является источником головной боли. Проблема заключается в неточностях при проигрывании уже готового коуба после публикации и обычно его неточном соответствии с версией проигрываемой внутри редактора до публикации коуба.

Если Вы создаете коуб с помощью встроенного coub редактора как видео, так и недавно добавленного аудио ряда — то совет тут только один, публикуйте промежуточные версии на запасной канал, с видимостью private или unlisted (если хотите кому-то показать) и смотрите много циклов подряд, что в итоге получилось. Пробуйте много раз и потом просто удалите промежуточные версии.

Теперь перейдем к созданию коуба при помощи видео и аудио смонтированного целиком во внешних редакторах, и которые мы просто хотим соединить в coub редакторе желательно с минимум изменений. Речь идет об одном непрерывном видео фрагменте меньше 10 секунд и одном внешнем аудиотрэке (т.е. который не является частью видео ролика). Может быть это будет работать и для 10 секунд ровно, но тут поступали противоречивые сведения.

ВНУТРЕННОСТИ КОУБА И СОВЕТЫ
Прежде всего, небольшое описание, что происходит при публикации коуба:
1) видео и вероятно аудио конвертируется при помощи ffmpeg на стороне coub.com — эта техническая деталь некоторым объяснит многие детали приведенные ниже.

2) видео конвертируется сайтом в версию не выше 720p качества (1280x720), с частотой кадров ровно 25fps, что соответствует 0.04 секунды на каждый кадр. Желательно всегда готовить сорс видео для коуба ровно с характеристиками 1280x720, 25 fps. Если соотношение 16x9 (1280x720) выдержать невозможно и обрезка видео кадра (crop) слишком испортит визуальный ряд, то: зафиксировать 720 высоту, если удастся добиться ширины <=1280 (в неполноэкранном режиме коуб будет отражаться в более крупном размере, что лучше чем альтернатива обычно); или иначе фиксировать 1280 ширину и снижать высоту ниже 720 (в неполноэкранном режиме коуб будет отражаться в менее крупном размере).

Здесь и далее предполагается, что сорс видео для коуба готовится исходя из 25fps (кадр=0.04 секунды). Скорее всего это не имеет значения для дальнейших советов, но лучше стараться делать 25fps для наиболее предсказуемых результатов.

3) любая аудио дорожка отдельная при публикации в коуб будет переконвертирована в несколько итоговых аудио дорожек различного качества, базовый формат их mp3, даже если они имеют flv обертку.

Есть 4 разновидности качества аудио, которое показывается разным клиентам в разных условиях (например, лента на браузере в среднем качестве, полноэкранные режим браузера в высоком качестве, мобильные устройства и т.п.)

Высокое качество: 192 kb/s, 44.1 kHz — очень важный момент, что даже если Ваш сорс ниже качеством, он все равно будет конвертирован в такой формат при публикации для высокой версии, которая покажется например в полноэкранном режиме браузера (mp3 формат). Таким образом, я рекоммендую готовить сорс аудио дорожку именно в таком качестве, отключать нормализацию звука при публикации коуб и лучше пересоздавать заново коуб, а не перепубликовывать старый.

Среднее: 128 kb/s, 44.1 kHz — коубы в ленте браузера, в mp3.
Низкое: 64 kb/s, 44.1 kHz
Низкое для мобильных устройств: 64 kb/s, 24 kHz

Помимо прочего, исследование показало, что в ряде случаев генерируемые при публикации дорожек имеют различные степени удлиненния и смещения, когда начинать проигрывания.

Самое частое смещение наблюдаемое — итоговая аудио дорожка становится примерно на 0.05 секунды длиннее за счет добавления 0.05 секунд в виде тишины в начале аудио трэка итогового. Т.е. это означает, что аудио начнется примерно на 1 кадр позже, чем было рассчитано в теории и общий аудио трэк удлинится на 0.05 секунд.

Дело в самом формате mp3, это неточный и некачественный формат, и практически любой используемый конвертер в mp3 (ffmpeg, audacity) даст не совсем то после конвертации, что ожидалось и экстра +0.05 секунды тишины в начале, в частности. По-этому, аудио дорожку желательно подготовить в аудио редакторе и сохранить в более точном формате m4a, а еще лучше ogg. Да, она все равно переконвертируется при публикацией с добавлением +0.05 (для некоторых выходных форматов), но это хотя бы произойдет только один раз.

Переход между циклами всего аудио трэка (т.е. когда трэк целиком закончился и начинается заново) является наименее предсказуемой частью коуба после публикации, потому надо стараться всегда иметь аудио дорожку не короче 2х минут, чтобы минимизировать переходы между аудио трэками. Т.е. если аудио трэк очень короткий — его надо размножить в аудио редакторе и добить до 2х минут порядка.

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

Из этого следует, что аудио дорожка должна быть кратной видео циклу. Аудио цикл как минимум должен быть кратным 0.01 секунды (именно настолько можно подравнять кадры в коуб видео редакторе перед паблишем — что все равно придется делать из-за багов коуба, о чем ниже), или еще лучше кратным 0.04 секунды — чтобы можно было легко соотнести аудио цикл с целым числом видео кадров, что облегчает жизнь при точной синхронизации визуального ряда и звука.

Для этого для аудио надо изменить чуть-чуть темп (Change tempo эффект, в audacity например) чтобы аудио цикл точно соответствовал видео циклу. После этого, я добавляю тишину в конец всего аудио трэка, чтобы итоговая длина была кратна длине видео/аудио цикла и потом отрезаю 0.05 секунды и сохраняю в ogg.

Итоговые рекомендации по звуку:
- аудио дорожка минимум 2 минуты;
- аудио дорожка готовится и сохраняется в ogg формате для загрузки на коуб;
- темп аудио дорожки чуть-чуть пережимается, чтобы длина аудио цикла была кратной 0.01 секунды как минимум, или еще лучше 0.04 секунды;
- общая длина аудио дорожки должна быть кратной расчетной длине видео цикла (опционально для некоторых случаев: минус 0.05 секунды, которые coub.com предположительно и так добавит при публикации коуба).

4) после публикации коуба проигрывание может показать совсем не то, что ожидалось в теоретических расчетах. В самом проигрывателе coub.com есть баги синхронизации уже как минимум с начала 2015 вдобавок к выше изложенному. Вот детали и исторический контекст: https://www.facebook.com/permalink.php?story_fbid=135464476799666&id=100010083421299
До апреля 2016 был баг с залипанием при каждом проигрывании видео ряда на 0.02 секунды. Т.е. каждый видео цикл длиннее на 0.02 секунды относительно расчетного в теории, что вызывает нарастающий с каждым циклом рассинхрон.
В апреле в результате очередных фиксов рассинхрон стал вместо -0.02 секунды на цикл, +0.03 секунды на цикл, т.е. начиная с апреля 2016 надо добавлять 0.03 секунды к видео циклу относительно расчетного.

Однако, в конце июня 2016 произошло очередное изменение сломавшее синхронизацию до уровня, когда в различных операционных системах, браузерах и SD vs HD синхранизация работает по разному. Вы можете проверить всевозможные тесты http://coub.com/usun.tests опубикованные в начале июля 2016 (цель теста удержать гудок на белом фоне как можно дольше). Предварительные выводы: для vk.com плеера HD качества, и Ubuntu Chrome HD надо сноваотрезать -0.02 секунды, как это было до апреля. Для Windows, Firefox на самому сайте коуба наиболее стабильно в плане синхронизации проигрывается версия, в которой не надо ничего отрезать относительно расчетных значений.

Таким образом, перед паблишем коуба, в коуб видео редакторе в загруженном одном куске видео надо или отрезать 0.02 секунды (я обычно отрезаю с конца), или ничего не отрезать, взависимости от целевой аудитории. Что очень печально.

ПРИМЕР
У нас есть видео в 25fps и видео цикл желаемый примерно 7.47 секунды, или 186.75 кадра. Сразу для простоты я хочу работать с 187 кадрами или 7.48 секундным видео циклом (кстати, обычно видео ряд диктуется именно аудио циклом примерным).

Аудио цикл в оригинальном трэке у нас при этом рассчитан как 7.472 секунды. Делаем всему трэку Change tempo чтобы аудиоцикл ровнялся 7.48 — разница в темпе настолько мала, что не будет заметна уху, но существенно упростит все расчеты и по-кадровую синхронизацию, если таковая требуется. Помним, что после публикации синхронизация везде глобально сместится где-то на 1 кадр при конвертации звука во время публикации коуба.
Итого: расчетный аудио-видео цикл 7.48 секунды.

Делаем аудио дорожку кратную 7.48 за вычетом ожидаемых 0.05 (которые будут добавленным коубом ко всему трэку) и с длиной минимум около двух минут. Добиваем тишину чтобы расширить трэк до ближайшей кратной 7.48.
(7.48*16)-0.05=119.63 секунды аудио трэк получаем и сохраняем его в ogg формате.

Итак, мы создаем коуб, в который грузим видео файл одним куском 7.48 секунды (187 кадров), и грузим ogg аудио трэк длиной 119.63 секунды.
В редакторе коуба отрезаем с конца видео 0.02 секунды и получаем коуб длиной 7.46 секунды (или другой вариант — ничего не отрезаем и оставляем 7.48 секунды). Делаем паблиш как private или unlisted на отдельный канал и проверяем результат (как минимум один раз ждем проигрывания всего аудио трэка, чтобы убедится что трэк второй раз пойдет проигрываться ровно с началом видео цикла).
Если результат удовлетворительный, можно пересоздать коуб, опять отрезать 0.02 секунды (или не отрезать) не забыть и уже паблишить на основной канал как public (при этом стоит всерьез рассмотреть опцию Do Not Normalize Sound — я обычно отмечаю этот чекбокс, ибо дорожку я обычно готовлю нормальной громкости и не хочу никаких лишних действий со стороны coub.com, который работает как черный ящик).