Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.05.2023, 15:05
Аспирант
Отправить личное сообщение для Destrifer Посмотреть профиль Найти все сообщения от Destrifer
 
Регистрация: 29.11.2008
Сообщений: 64

Постер в тегу video
Хочу автоматически ставить постер, на основании содержимого видеофайла.
Как это сделать?
Ответить с цитированием
  #2 (permalink)  
Старый 19.05.2023, 15:11
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,720

Google: ffmpeg extract frame from video

upd. или вот варианты, но с буферизацией видео:
https://stackoverflow.com/questions/...in-html5-video

Последний раз редактировалось Nexus, 19.05.2023 в 15:18.
Ответить с цитированием
  #3 (permalink)  
Старый 19.05.2023, 16:53
Аспирант
Отправить личное сообщение для Destrifer Посмотреть профиль Найти все сообщения от Destrifer
 
Регистрация: 29.11.2008
Сообщений: 64

Спасибо, но я имел ввиду средствами frontend конечно-же, а не просто ПК.
По идее мне надо для каждого видео делать отдельный постер, а хочется автоматом.

Во второй ссылке про те древние времена, когда первый кадр видео не использовался сейчас как постер.
Но первый кадр часто черный, не подходит.

И да, я пробовал использовать "#t=0.1", у меня не работает .
Ответить с цитированием
  #4 (permalink)  
Старый 19.05.2023, 17:29
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,720

Destrifer, имхо, лучше выковырять фрейм из видео и сохранить его отдельно, чем каждый раз заставлять клиента подгружать часть видео.
Если на странице будет список записей, то это как лишний трафик для клиента, так и лишняя нагрузка на сервер.
Ответить с цитированием
  #5 (permalink)  
Старый 20.05.2023, 01:31
Аспирант
Отправить личное сообщение для Destrifer Посмотреть профиль Найти все сообщения от Destrifer
 
Регистрация: 29.11.2008
Сообщений: 64

Ну это также и лишнее поле и лишний запрос в БД.
А траффик сейчас все-же не как 20 лет назад - скорости выросли значительно.
Да и это больше pet-проект, поэтому мне больше интересна сама реализация механизма.

Вот что пока удалось сделать: http://ilikeike.beget.tech/
Получается мы можем вытянуть любой фрейм и сохранить его как картинку, и, в теории, подставить как постер.

Единственно, вопрос в грамотной реализации последовательности событий.
Получается, сначала нам нужно:
1. Перемотать видео.
2. Сохранить текущий кадр в img.
3. Подставить его как постер, в это же самое видео.

Но постер инициализируется при отрисовке DOM. Его нельзя довставить "потом".

И у меня нет уверености, что мы можем до отрисовки получить фрейм, и вставить как постер и потом отрисовать.

Конечно можно с одного экземляра вытаскивать фрейм, и вставить в тот что увидит пользователь. Просто отложить его загрузку для пользователя.

И мне не совсем понятно как реализовать эту отложенную загрузку.
Создавать эти вторые экземляры через js? Это уже усложнит код. Должно быть более простое решение.

И с вытаскиванием фрейма тоже вопросы. По событию пользователя все работает. А как это сделать в фоне, без участия пользователя?
Ответить с цитированием
  #6 (permalink)  
Старый 20.05.2023, 08:37
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,700

Сообщение от Destrifer
А как это сделать в фоне, без участия пользователя?
Никак. Видео нельзя запустить без события, инициированного пользователем
Ответить с цитированием
  #7 (permalink)  
Старый 20.05.2023, 13:45
Аспирант
Отправить личное сообщение для Destrifer Посмотреть профиль Найти все сообщения от Destrifer
 
Регистрация: 29.11.2008
Сообщений: 64

Как нельзя?
Можно же.
Нельзя со звуком, но если стоит muted то все работает.
А нам для фрейма звук и не нужен.
Ответить с цитированием
  #8 (permalink)  
Старый 20.05.2023, 14:22
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,700

Ну если можно, то прогоните видео до нужного тайм-кода (fastSeek) и ловите событие seeked. По событию берите картинку из видео.

Но лучше для каждого виде вручную подготовить кадр - картину.

Последний раз редактировалось voraa, 20.05.2023 в 14:26.
Ответить с цитированием
  #9 (permalink)  
Старый 20.05.2023, 19:03
Аспирант
Отправить личное сообщение для Destrifer Посмотреть профиль Найти все сообщения от Destrifer
 
Регистрация: 29.11.2008
Сообщений: 64

Спасибо.
Почти получилось. http://ilikeike.beget.tech/
Получаю картинку и подставляю в постер ко второму видео.
Но оно идет с белым экраном.
window.onload = function () {
var video = document.getElementById('videoId');
var canvas = document.createElement('canvas');
var img = document.createElement('img');
video.currentTime = 5;

	video.onseeked = function () {
		canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
		img.setAttribute('src', canvas.toDataURL());
	};
	
	video.insertAdjacentElement('afterEnd', img);
	document.getElementById('video2').setAttribute('poster', canvas.toDataURL());
};


Думаю надо чуть "задержать" подгрузку html другого видео, чтобы постер был готов. Есть варианты?
Или только createElement?
Ответить с цитированием
  #10 (permalink)  
Старый 20.05.2023, 23:48
Аспирант
Отправить личное сообщение для Destrifer Посмотреть профиль Найти все сообщения от Destrifer
 
Регистрация: 29.11.2008
Сообщений: 64

Ещё проблема в том что метод toDataURL, выдает картинку в base64.
Но атрибут poster не поддерживает такие длинные строки и обрезает код.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как присоединить m3u8 к тегу video из HTML5 ? exem (X)HTML/CSS 1 31.03.2021 12:51
Настройка трансляции на сайт mikhail_zvonarev Общие вопросы Javascript 0 19.04.2020 20:47
video не воспроизводит удаленный поток WebRTC Serg__ Библиотеки/Тулкиты/Фреймворки 0 29.03.2019 16:05
Получить кадр video элемента в картинку Arhitector Общие вопросы Javascript 8 08.10.2018 22:08