Я делаю приложение с видео HTML5 вместе с холст-рисунком поверх него (640x480 пикселей). Цель состояла в том, чтобы записать рисунок холста вместе с кодированным видео, чтобы создать его как одно видео. Я смог сделать все это с помощью FFMPEG. Но проблема, с которой я столкнулась, заключается в том, что при запуске видео HTML5 требуется около 50% моего процессора. Так как рисование на холсте также требует процессора, браузер замораживается через определенное время, а использование ЦП для этой вкладки на хроме постоянно показывает> 100. Я попытался оптимизировать рендеринг html5. Но ничего не помогло. Есть ли способ запустить это видео с гораздо меньшим потреблением процессора? или любые другие возможности оптимизации?Оптимизация видео и холста HTML5
ответ
Существует не так много, если аппаратное обеспечение должно использовать процессор для декодирования и отображения видео. Ключевое слово - компромисс.
Можно сделать несколько вещей, хотя это устраняет дополнительные барьеры. Они должны быть рассмотрены общие советы, хотя:
Эффективное перекручивание
Обязательно используйте requestAnimationFrame()
, чтобы вызвать свой цикл в случае, если вы не являетесь.
setTimeout()
/setInterval()
являются относительно тяжелыми и не могут правильно синхронизироваться с частотой обновления монитора.
Снизить нагрузку обновления
Кроме того, если вы еще не делаете это: холст обычно обновляется при 60 FPS, а видео редко превышает 30/29,97 FPS (в Европе 25 FPS). Это означает, что вы можете пропустить каждое обновление второго кадра и по-прежнему показывать видео с оптимальной скоростью. Для этого используйте переключатель.
Видео с частотой 25 FPS будет синхронизироваться с частотой 30 FPS (обычно мониторы работают на частоте 60 Гц даже для европейских моделей, которые с помощью электронной перестройки синхронизируются внутри, что также означает, что браузеру необходимо иметь дело с кадром/двойным кадром и т. Д. внутренне - мы ничего здесь не можем сделать).
// draw video at 30 FPS
var toggle = false;
(function loop() {
toggle = !toggle;
if (toggle) { /* draw frame here */ }
requestAnimationFrame(loop);
})();
Избегайте масштабирования холста элемента
Убедитесь, что размер холста и размер CSS точно такой же. Или просто: не используйте CSS, чтобы установить размер холста.
Отключить альфа-канал композиции
Вы можете отключить альфа состав холста в некоторых браузерах, чтобы получить немного больше скорости. Потребительское видео никогда не поставляется с альфа-каналом.
// disable alpha-composition of the canvas element where supported
var context = canvas.getContext("2d", {alpha: false});
настройки Tweak на этапе кодирования
Убедитесь, что кодировать видео, используя баланс между размером и декомпрессионной нагрузкой. Чем больше видео сжимается, тем больше нужно реконструировать за счет стоимости. Кодируйте с различными настройками кодировщика, чтобы найти баланс, который работает в вашем сценарии.
Также рассмотрите такие аспекты, как глубина цвета, то есть 16 против 24 бит.
Рекомендуется использовать кодек H264, поскольку он имеет широкую поддержку в различных аппаратных средствах интерфейса дисплея.
Уменьшить видео FPS
Если содержание видео позволяет, п.ех. есть небольшое движение или изменения, кодирование с использованием 15 FPS вместо 30 FPS. Если да, то также использовать MODULO вместо переключателя (как показано выше), где вы можете пропустить 3 кадров и обновление холст только на Кодировать видео 4 .:
// draw video at 15 FPS
var modToggle = 0;
(function loop() {
if (modToggle++ % 4 === 0) { /* draw frame here */ }
requestAnimationFrame(loop);
})();
при меньшем размере источника
закодировать видео с чуть меньшим размером, делящимся на 8 (в этом случае я бы даже предложил половину размера 320x240 - эксперимент!). Затем проведите, используя параметры масштаба метода drawImage()
:
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, 640, 480);
Это поможет уменьшить количество данных, необходимых для загрузки и декодируется, но, конечно, будет снижать качество. Как выясняется, снова зависит содержимое.
Вы также можете отключить интерполяцию с использованием imageSmoothingEnabled
, установленного в значение false в контексте (примечание: для свойства требуется префикс в некоторых браузерах). Для этого вы можете не захотеть уменьшить размер до 50%, но только немного (что-то вроде 600x420 в этом случае).
Примечание: даже если вы «уменьшаете» частоту кадров, холст все еще перерисовывается при 60 FPS, но поскольку он не выполняет никакой реальной работы на промежуточных кадрах, он все еще отключает CPU/GPU, что дает вам менее жесткий бюджет исполнения.
Надеюсь, что это дает некоторый вклад.
- 1. Оптимизация нескольких видео HTML5
- 2. От холста html5 до видео
- 3. Перерезать элемент холста (видео) HTML5 на куски
- 4. Оптимизация рендеринга холста
- 5. Html5 размытие холста и сохранение
- 6. HTML5 анимация и вращение холста
- 7. HTML5 Видео и деградация?
- 8. Html5 холст и видео
- 9. HTML5 видео и холст
- 10. Холст и видео - HTML5
- 11. Необходимо ли использовать 2 холста для обработки видео html5?
- 12. Оптимизация холста С rect() И fillRect()
- 13. HTML5: Вручную «воспроизводить» видео внутри холста, в IOS Safari
- 14. HTML5 Изменение цвета холста
- 15. Динамическая анимация холста HTML5
- 16. HTML5 рендеринг холста странно
- 17. html5 соотношение сторон холста?
- 18. HTML5 Ресурсы холста/анимации
- 19. Сохранение данных холста HTML5
- 20. HTML5 масштабируются размер холста
- 21. Android-пикселизация холста HTML5
- 22. Удалить видео с холста после его воспроизведения - HTML5
- 23. Создание бесконечного холста HTML5
- 24. Html5, JavaScript, анимация холста?
- 25. Html5 перекрестки текста холста
- 26. HTML5 сохранение холста
- 27. html5 полотна ширины холста
- 28. HTML5 холста передовых рамок
- 29. HTML5 Матрица трансформации холста
- 30. Перемещение элемента холста HTML5
Благодарим Вас за отзыв. Я оптимизировал его, уменьшив FPS, как вы уже упоминали. Поскольку я требовал, чтобы взаимодействия на холсте смотрели в реальном времени, я пробовал играть с FPS. То, что я точно сделал, это записать холст на 12 FPS и с помощью FFMPEG I закодировал его с 24 FPS. Это помогло добиться желаемых результатов. –