MediaElement.js - Flash-видео не воспроизводится до полной загрузки

У меня возникла проблема с тем, что MediaElement.js (мой флеш-видеопроигрыватель) не будет воспроизводить мои видеофайлы .m4V (закодированные с помощью ffmpeg), пока видео не будет полностью загружено.

Я тестировал это с различными видеофайлами сторонних производителей, которые воспроизводятся сразу после полной загрузки. Только мои файлы нет :(

При воспроизведении с использованием решения для видео html5 они воспроизводятся сразу, только не на резервном флэш-накопителе.

Может ли это быть связано с настройками, в которых кодируется видео? Другой причины не вижу.

КОД:

<video id="player1" src='BriefTour.m4v' type="video/mp4" preload="none"></video>

<script>
var videoPlayer = MediaElement('player1',{
  success:function(me){me.play();}              
});
</script>

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

Надеюсь, кто-то воспользовался этим раньше и сможет мне помочь!


person wilsonpage    schedule 20.02.2011    source источник
comment
Эй, как вы кодируете свои видео или откуда вы их берете?   -  person Kit    schedule 22.02.2011
comment
Я использую FFMpeg для кодирования их на стороне сервера.   -  person wilsonpage    schedule 22.02.2011
comment
Обратите внимание, что ответы Кит и Джона Дайерса, приведенные ниже, отлично работают и выполняют одно и то же ... просто зависит от того, хотите ли вы командную строку или настольное решение.   -  person squarecandy    schedule 26.03.2012


Ответы (4)


Поскольку вы кодируете свои собственные видео и используете FFmpeg, я предлагаю использовать qt-faststart.

Это полезный инструмент, включенный в FFmpeg, который переупорядочивает файл с видео H.264, «таким образом, что атом moov находится перед данными, облегчая тем самым потоковую передачу по сети». По сути, это позволяет запускать воспроизведение веб-фильмов до того, как они будут полностью загружены.

Включите его в следующем каталоге ffmpeg:

cd ~/ffmpeg
make tools/qt-faststart

Использование (после кодировки ffmpeg):

qt-faststart input.foo output.foo

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

person Kit    schedule 22.02.2011
comment
Я тоже страдаю от этого. Все мои видео - файлы MP4. Все они начинают играть только тогда, когда начинают загрузку при использовании проигрывателя HTML5. Но с резервным Flash-файлом обязательные из них не запускаются, пока не будут полностью загружены. Единственные, которые работают сразу после нажатия кнопки воспроизведения, загружаются с Vimeo, а не те, которые я закодировал. Я пробовал qt-faststart в своем, но он говорит, что последний атом в файле не был атомом moov, и он не создает никакого файла, поэтому я предполагаю, что файл уже был в порядке. Не удалось попробовать QTIndexSWapper, потому что мне нужно, чтобы он работал на моем хостинге на базе Linux (обе программы делают то же самое?). Какие-либо предложения? - person Pere; 15.03.2013
comment
Хорошо, я сам нашел решение своего предыдущего комментария. Добавив его как ответ ниже. - person Pere; 15.03.2013

Flash не всегда может воспроизводить файлы MP4, если они не проиндексированы должным образом.

Чтобы исправить ваш файл, просто загрузите это: QTIndexSwapper

person John Dyer    schedule 22.02.2011
comment
Это работает с линуксом? Adobe Air больше не поддерживается на устройствах с Linux. - person franzlorenzon; 05.04.2013

Я попробовал qt-faststart с моими собственными файлами в кодировке MP4 (h264 + AAC) и всегда получал сообщение об ошибке «последний атом в файле не был атомом moov» (и без выходного файла). Тогда я предположил, что с моими файлами все в порядке, и искал проблему в другом месте. После нескольких часов тестирования мое предположение оказалось неверным - действительно, кажется, в моих файлах вообще не было moov-атома, ни в начале, ни в конце!

Чтобы успешно исправить это, я сначала использовал ffmpeg, чтобы «регенерировать» файл, то есть преобразовать исходные треки h264 + AAC в новый файл MP4 без его перекодирования:

ffmpeg -i souce_file.mp4 -acodec copy -vcodec copy target_file_1.mp4

После этого новый файл должен иметь в конце свой собственный moov-атом. Итак, теперь вы можете использовать qt-faststart, чтобы переместить его в начало, как объяснил Кит в своем ответе:

qt-faststart target_file_1.mp4 target_file_2.mp4

После этого mediaelement воспроизводит все мои видео сразу после нажатия кнопки воспроизведения, когда файл начинает скачиваться! :)

Если ваша проблема в том, что у вас уже есть все ваши файлы на сайте, похожем на youtube, ваш хостинг основан на Linux, ffmpeg отсутствует, и вы не можете его скомпилировать самостоятельно, вам, на мой взгляд, полезно получить статическую сборку ffmpeg. Вы можете найти это здесь:

http://ffmpeg.gusari.org/static/ (32-разрядная версия) или здесь: http://dl.dropbox.com/u/24633983/ffmpeg/index.html (64 бит)

К сожалению, в 32-битной сборке, которую я использовал, не было qt-faststart, ни в виде двоичного, ни в виде исходного кода. В этом случае вы можете загрузить его из ffmpeg SVN и скомпилировать напрямую с помощью gcc. Я успешно сделал это на своем виртуальном хостинге ultra-el-cheapo. Похоже, что у него нет никаких зависимостей от сборки. Или вы даже можете попробовать мою собственную двоичную сборку qt-faststart и посмотреть, работает ли она для тебя.

РЕДАКТИРОВАТЬ: Я только что обнаружил, что в новых версиях qt-faststart вообще не нужен. Вы можете кодировать напрямую с помощью ffmpeg, используя следующую опцию:

-movflags +faststart 
person Pere    schedule 15.03.2013

Я хотел немного расширить комментарий Джона Дайера и сказать, что использование QTIndexSwapper не только для резервных / резервных функций Flash в MediaElement.js, но также работает для проигрывателя без Flash.

Проблема, с которой я столкнулся, заключалась в проигрывателе без Flash, мой файл .mp4 должен был загружать полное видео до того, как оно началось (я не проверял версию Flash, пока она не работала без Flash), а QTIndexSwapper решил проблему проблема.

Я хотел указать на это, потому что, когда я впервые прочитал комментарий, я подумал, что он применим только к Flash, и не сразу попробовал. Не то чтобы я что-то забираю у Джона Дайера, поскольку именно его комментарий решил мою проблему в конце, я просто хотел добавить к нему, так что, надеюсь, другие не сделают мою ошибку.

Если кому-то интересно, я написал сообщение об этом в блоге проблема и о классе PHP, который тоже должен это исправить.

person Neil Nand    schedule 07.02.2013