2016-03-08 15 views
5

YouTube to fajna funkcja, gdzie można „peeling” poprzez wideo i dają pogląd miniatury wideo w każdej sekundzie:uzyskać obraz ramy filmu w co drugim

enter image description here

Czy ktoś wie, jak to osiągnąć? Czy serwer musi przesłać każdy obraz osobno, czy może zostać wyodrębniony z wideo na komputerze klienta za pomocą javascript?

Jeśli chodzi o implementację "ekstrakcji", jestem trochę zagubiony, ale wyobrażam sobie, że element canvas może zostać użyty do narysowania klatek po ich wyodrębnieniu.

Jeśli serwer musi być używany: ponieważ obrazy są małe, wyobrażam sobie, że mogę używać sprite'ów, ale jeśli mówimy o każdej sekundzie wideo, wtedy ten plik może stać się całkiem duży. (wciąż małe w porównaniu z danymi wideo, które myślę, ale nie do końca optymalne)

+0

Jest tysiąc różny sposób mogą Państwo osiągnąć to, wybrać jedną, a następnie ponownie zadać pytanie. –

+0

Mogę tylko począć 2. (te, które opisałem). Nie jestem pewien, czy to drugie jest wykonalne, ponieważ nie mogę wymyślić sposobu na jego wdrożenie. Wolałbym to od tego pierwszego, jeśli to możliwe, z oczywistych powodów. – LukeP

+0

@AdamBuchananSmith Jeśli chodzi o próby wdrożenia tego ostatniego. Mam kilka (rodzaj niejasnych) pomysłów, pozwól mi dodać je do pytania. – LukeP

Odpowiedz

1

tl; serwerowe generowane arkusze sprite DR, pobrane zgodnie z potrzebami.

Możemy zgadywać, że obrazy są generowane po stronie serwera. YouTube robi o wiele bardziej intensywne przetwarzanie na każdym filmie niż wyciągnięcie kilku miniatur. Ponadto szybki Google sugeruje, że ta funkcja działa już od kilku lat - prawdopodobnie dłużej niż wymagana moc HTML5/JS/przeglądarki, aby wykonać tę stronę po stronie klienta.

Wpadłem Download Tools > Resources w mojej przeglądarce i wypróbowałem newly-posted video z mojego kanału. Co ciekawe, nie było jeszcze podglądu (wideo było tylko około 20 minut, gdy sprawdziłem). Oznacza to, że obrazy są prawdopodobnie generowane po stronie serwera i po prostu nie zostały zakończone.

Sprawdzanie an older video i przejrzenie Resources > Images nie ujawniło nic interesującego. Więc przełączyłem się na Timelines i uderzyłem w rekord, a następnie zacząłem mementować na osi czasu i obserwować ruch sieciowy. Jak przeniosłem myszy *.jpg pliki rozpoczął załadunek i zawierały 25 miniaturek z danego odcinka wideo:

example youtube scrubbing preview sprite sheet

Zauważyłem również, że początkowy plik M0.jpg jest taki sam rozmiar obrazu, ale zawiera około 100 miniatury z całego filmu, a nie 25 miniatur z jednego segmentu. Przykład:

example overview M0.jpg file

Testowanie ponownie z nowym filmem, wygląda jak 100-image M0.jpg zostanie pobrany pierwszy i zapewnia podstawowe dolne-res mniej ziarnistych miniaturki. Następnie, po najechaniu kursorem myszy na różne sekcje wideo, pliki o wyższej rozdzielczości M0.jpg, M1.jpg itd. Zostaną pobrane w razie potrzeby.

Co ciekawe, nie zmienia się to w przypadku longer videos, co wyjaśnia, dlaczego miniatury mogą czasem ssać. Jeśli Twoje połączenie lub YouTube jest zbyt wolne, aby uzyskać miniatury o wyższej rozdzielczości, utkniesz przy użyciu tylko 100 miniaturowych miniatur o naprawdę długim filmie. Nie wiesz, jak to działa w przypadku krótszych filmów.Interesujące może być również zobaczenie, z jakiej dystrybucji czerpią miniaturki (czy jest to liniowy co 1/100 wideo lub coś innego).

Ostrożnie, zauważyłem, że jeśli używasz adresu URL z kodem czasowym, nie dostaniesz pełnego arkusza 100-obrazowego M0.jpg, ale zupełnie inny rozmiar M#.jpg zawierający około 25 miniatur o niskiej rozdzielczości z kodu czasowego do końca filmu.

subset of thumbnails for timecoded video

Chyba oni zakładając, że kiedy ludzie odwołują się do konkretnego kodu czasowego, użytkownicy nie mogą przeskoczyć do wcześniejszego punktu w filmie. Jest to również mniej ziarnistości niż ~ 75 obrazów, które uzyskałbyś, wysyłając normalny obraz 100: M0.jpg. Z drugiej strony, jest to również około 30% rozmiaru, więc może prędkość była tak ważna.

chodzi o generowanie miniaturek, ffmpeg jest dobrym sposobem, aby przejść:

Aby wykonać wiele zrzutów ekranu i umieścić je w jednym pliku obrazu (tworzenie płytek), można użyć filtra dachówka wideo ffmpeg, podobnie jak to:

ffmpeg -ss 00:00:10 -i movie.avi -frames 1 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png

to będzie dążyć do 10 sekund filmu, wybrać każdy 1000-ramkę, skalować do 320x240 pikseli i tworzenia płytek 2x3 w out.png wyjście obrazu, który będzie wyglądać następująco:

tile image from ffmpeg

Powiązane problemy