Как правилно да се справите с превключването на html5 видеоклипове

Дойдох тук след много проблеми с нещо, което може да е свързано само с видеоклипове и вероятно е лошо разбиране на ресурсите на страницата като цяло. Това, което се опитвам да постигна, е възможността да имам една уеб страница, в която чрез щракване върху бутоните „напред“ и „назад“ човек може да промени съдържанието на div, за да покаже един от видеоклиповете в очевиден последователен ред. В момента видеоклипът е във формат mp4 в html5 видео елемент.

Опитах няколко метода.

  • директно променя src на изходния елемент (изглежда не прави нищо)

  • премахнете елемента и го добавете отново с различен src. (има проблем, описан по-долу)

  • премахнете елемента и използвайте Jquery .load(), за да поставите външен html файл с целия видео елемент в него, включително отделен html файл за всеки src. (има проблем, описан по-долу)

  • премахнете елемента и го добавете отново със src, сочещ към изтегляне на файла от GridFS, използвайки рамката на колбата на python. (има проблем, описан по-долу)

Добре, така че основният проблем, който имам, е с многократните изтегляния на едно и също видео от страницата. Кажете, че ако щракнете върху „следващ видеоклип“, след това върху „предишен видеоклип“. Това кара видеото да е „черно“ (изобщо не се зарежда, действа като src е повреден). Първият път, когато всеки от видеоклиповете е заявен, той се зарежда за по-малко от секунда, вторият път варира, но винаги е над 10 секунди. преди съдържанието на видеото да изскочи и да стане възпроизвеждано. Мрежовите инструменти за разработка на Google Chrome изброяват медиите като „чакащи“, докато чакам, когато най-накрая приключи с чакането, горният видеоклип става червен (отменен), а новият източник – „частично съдържание“. По време на времето за изчакване изглежда не може да изтегли нищо от сървъра, включително преобръщащи се изображения.

Опитах това локално с flask и python simple html сървър, както и на 8-ядрен сървър през гигабитов Ethernet. Това не е проблем на случайно забавяне на мрежата, случва се нещо странно.

Едно от нещата, които се опитвам да разбера, е как даването на нова заявка към сървъра работи с частично съдържание. Имах някаква идея, че кеша на браузъра ще съхрани файла, така че второто зареждане трябва да бъде по-бързо, което така или иначе би било оптимално. Това все още ли се случва с html5 видеоклипове?

Също така трябва да се отбележи, че файловете са сравнително малки, една минута или повече видеоклипове от около 20 mb. Изглежда, че уеб сървърът просто блокира втората заявка по някаква причина и се чудя дали някой от вас е чувал за това. Мога да публикувам код при поискване, но мисля, че концепцията е доста проста.

Планирам да използвам GridFS с колба за окончателното внедряване на този сайт.

Поради предложението по-долу се опитах да премахна елемента източник и да прикача атрибута src към самото видео. Това води до същия резултат. Ето сравнително простото нещо, което правя:

$('#addlinks').click(function(){

    $('#maininside').remove();
    $('#maintext').append('<div id=maininside></div>');        
    $('#maininside').html('<video width="100%" controls src="/getmedia/dangerisland-01-video-01.m4v">Your browser does not support the video tag.</video>');

});

<article id="maintext">            

        <div id="maininside">            

        </div>       

</article>

Първият път, когато се щракне върху бутона, има много малко забавяне и мога да видя високо използване на мрежата на монитора, докато видеото се изтегля. След като бутонът бъде щракнат отново, в този случай не получавам използване на мрежата за около 30 секунди, след което отново се изтегля с пълна скорост и се връща. Ето изгледа на разработчиците на използването на мрежата веднага след като се възстанови за втори път:

Неуспешно изтегляне в мрежовия раздел на Chrome, показва се като отменено

Благодарим ви за всяко прозрение, което може да имате.


person Rboreal_Frippery    schedule 04.01.2014    source източник
comment

Ако абсолютно трябва да промените изображението с помощта на код, тогава трябва да обвържете свойството Image.Source с данни и след това да промените пътя на обвързаното с данни изображение:

<StackPanel Orientation="Horizontal">
    <Image Source="{Binding ImageSource}" Height="30" Margin="14,0" />
</StackPanel>

Стойността по подразбиране за вашето ново свойство ще бъде Resources/dial.png и можете да я промените така:

ImageSource = "Resources/hangup.png";

Разбира се, вашето ImageSource свойство трябва да уведоми INotifyPropertyChanged Интерфейс на промяната, така че потребителският интерфейс да може да актуализира Image. Въпреки това трябва да се каже, че използването на Trigger или DataTrigger за промяна на Image.Source в XAML би било по-добро решение.

  -  person kalhartt    schedule 04.01.2014


Отговори (1)


Тук има много подвъпроси и променливи; не съм сигурен колко добре мога да се справя с всички тях, но ще опитам.

  • Коментарът от kalhartt ви кара да се коригирате по отношение на простото променяне на източника. Но ще отбележа, че според моя опит поведението, което ще видите от различните браузъри, докато преминавате през този процес, ще бъде непоследователно. Работих по този въпрос през последната година и поне по това време това беше лошо потребителско изживяване - потребителят смяташе видеото за повредено, докато браузърът реагира на промяната в източника и новото зареждане. В крайна сметка генерирахме нови видео елементи и ги изключихме (но дори това може да бъде изпълнено с клопки поради разликите в кои медийни събития всеки браузър публикува кога.)

  • Не съм сигурен как обслужвате видеоклиповете, но сървърът за разработка на колба блокира (освен ако не зададете app.run(threaded=True), мисля.)

  • Възможно е също така да се сблъскате с поведение, причинено от вътрешната логика за зареждане/кеширане на видео в браузъра, и дори ще наблюдавате значителни различия в начина, по който всеки браузър се справя с тези задачи. Добър начин за тестване срещу това поведение би бил да добавите уникален низ на заявка (може би с клеймо за време) за всяко зареждане; видеоклиповете трябва да се зареждат успешно (ако сървърът не блокира.) Ако проблемът е блокирането на сървъра, може да си струва да хоствате видеоклиповете на S3, докато не сте готови да се съсредоточите върху начина, по който се доставят.

  • Друга възможност е да не унищожавате оригиналния видео обект, ако подозирате, че ще бъде използван отново (вместо това можете да го поставите на пауза, да го премахнете от DOM и да запазите препратка към него). Ако повторната употреба обаче е малко вероятен случай и особено ако очаквате потребителите да възпроизвеждат много видеоклипове при зареждане на една страница, може би е най-добре да ги отхвърлите. Компромис може да бъде запазването на фиксиран брой предишни видео обекти.

person abathur    schedule 09.04.2014