Ошибка в Adobe Flash Player
В процессе создания автоматизированного перекодировщика пришлось наступить в одну очень неприятную проблему. Беда в том, что Adobe Flash Player очень ревностно относится к наличию дополнительной мета-информации в mp4-файле. А именно — при наличии в ролике разбиения на главы проигрывание не начинается до тех пор, пока ролик не загрузится целиком в случае использования nginx + mod_h264_streaming, или начинает проигрывание, но показывает неверную продолжительность ролика и умирает при попытке проигрывания с произвольного места в случае erlyvideo.
Активные попытки выяснить как удалить из mp4 информацию о главах завершились неуспешно — было найдено куча решений «как добавить» а вот с удалением было сложно. В результате родилось наколенно-костыльное решение: сначала перепаковать видео в MKV-контейнер с удалением оглавления, а затем перепаковать обратно в MP4. Процесс занимает не более 15 секунд, что вполне терпимо.
В результате, все видео, обработанное нижеприведенным сценарием, спокойно проигрывается в Flash Player:
1 2 3 4 | #!/bin/bash mkvmerge --no-chapters -o tmp.mkv $1 ffmpeg -y -i tmp.mkv -vcodec copy -acodec copy -f mp4 $1 rm tmp.mkv |
В процессе поиска этого бага были проведены следующие мероприятия:
- вдоль и поперек излазан код плеера
- проверены и отработаны различные настройки перекодирования
- менялся контейнер с ОС (с 64-хбитной на 32-х)
- был обновлен, проверен и перепроверен mod_h264_streaming
- были перепроверены настройки nginx
- был установлен и опробован erlyvideo
- с дебаггером внутрь Flash Plugin не лезли, но мысль была
Поиск бага длился почти рабочую неделю в фоновом режиме (2-3 часа в сутки).
Ограничения на воспроизведения видео на iPhone
В предыдущей заметке я рассказал про то, как сделать видео для iPhone, которое можно передавать на гаджет с использованием принципа Smooth Streaming. И даже дал ссылку на собственный проект, где применил результаты своего знания. К сожалению, как оказалось — весьма поспешно: люди, проверившие ресурс на iPhone 3G, сообщили, что ничего не работает и выдается одна и та же ошибка, схожая с той, которую получал я на своем аппарате — «Формат видео не поддерживается».
То, что я посчитал ограничением первой версии аппарата, оказалось более системным. Сложилось так, что эмуляция iPhone в SDK, распространяемом Apple, строится на немного иных принципах, нежели традиционная эмуляция аппаратуры, как это делали в QEMU в проекте OpenMoko. Если во втором случае действительно эмулировался ARM SoC, то разработчики iPhone пошли по пути меньшего сопротивления — они просто пересобрали среду под традиционную платформу (которая x86), и когда запускался эмулятор — по сути дела работает родной для платформы код, но с ограничениями, налагаемыми эмулятором. А когда программу для гаджета необходимо перенести на устройство — используется кросс-компиляция и уже генерируется код для платформы ARM.
Разумеется, при первых испытаниях трансляции псевдо-потока я использовал iPhone первого поколения и результат был плачевен — устройство от казалось играть данный формат. Но попытка воспроизвести тот же самый фрагмент в эмуляторе оказалась успешной, что и привело к ошибочному выводу, позднее опровергнутому посетителями ресурса. Скорее всего, эмулятор использует мультимедиа-прослойку операционной системы, гораздо менее привередливую, нежели та, которая используется в iPhone OS (у которой ноги растут тоже из Mac OS X). Поэтому он беспроблемно показал то видео, которое мой телефон посчитал сбойным.
Причина же невоспроизведения видео кроется не в формате, а в кодеке видео h.264. В его реализации для мобильной платформы Apple внесло ряд ограничений, нарушение которых ведет к тому, что файл просто не воспроизводется. Поэтому правильно подобранные параметры из ссылки в предыдущей статье приводят к закономерно успешному результату.
Мне остается выразить благодарность всем тем, кто протестировал мой ресурс и указал на ошибку. Спасибо большое!

