Cтриминг видео для iPad/iPod/iPhone на Bash-е — дёшево и сердито

    Здравствуйте, уважаемые хаброжители!

    В этой короткой статье я хочу поделиться опытом создания системы онлайн-вещания для устройств «одной фруктовой компании» :).




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

    Сами видеофрагменты могут передаваться как по HTTP так и по HTTPS – достаточно в директорию на любом веб-сервере своевременно дописывать сами видеофрагменты и обновлять плейлист с информацией о них.

    Несмотря на то, что видеофрагменты передаются по протоколу, который не поддерживает управление данными в реальном времени (как те же RTSP/RTP/RTMP), данный подход имеет несколько преимуществ — создать распределённую систему раздачи статического контента может даже школьник и (на мой взгляд — главная фича) данный подход позволяет вообще никак не танцевать с бубном для работы этих протоколов через NAT/Proxy.

    В документации Apple на сайте для разработчиков есть картинка, которая в наглядной форме поясняет, как это работает (хотя сам iPad там и не нарисован):

    image

    Самое главное в таком подходе — это чтобы сервер, который отвечает за конвертирование видео во-первых успевал его конвертировать со скоростью выше, чем 25 кадров в секунду, а во-вторых — имел достаточно хорошую и устойчивую связь с узлами, раздающими статический контент.

    Когда один из наших заказчиков (телевизионный канал, достаточно известный в Молдове и в Румынии — Jurnal TV) попросил нас реализовать подобную систему вещания для iPhone/iPad/iPod в сети MDX (высокоскоростная сеть внутри страны, к которой подключены все провайдеры и трафик в которой безлимитный) у нас был выбор:
    1. Использовать готовые системы (не буду называть имён производителей, так как NDA) — стоимостью от 10 000 евро и до горизонта (зависит от рюшечек, имеющихся у софта) за программно-аппаратный комплекс, состоящий из одного сервера и ПО, которое со свистелками и перделками позволяет раздавать статический контент на конечные узлы (краевые сервера, edge servers в английской терминологии) — которые, конечно же, в стоимость не входят.
    2. Самостоятельно реализовать подобную систему, тем более, что в наличии имелось несколько свободных бездисковых серверов, которые мы используем для обычного веб-вещания (при помощи VLC и тоже по HTTP, кстати — если будет интересно — расскажу) — с очень шустрыми процессорами и кучей оперативки.
    3. Так как мы не ищем лёгких путей, да и не имело смысла клиенту тратить кучу денег на новую систему, мы выбрали второй вариант.


    Что у нас имелось:
    1. Неограниченный доступ к видеосигналу в любом виде, мы выбрали SDI
    2. Конвертер SDI->DV, который мы нормально видели как IEE1394, более известный в народе как «Fire Wire».
    3. Бездисковый сервер с 4х-ядерным Xeon-ом на борту под управлением Ubuntu Maverick.


    Вкратце, алгоритм работы системы такой:
    1. Получить видеофрагмент длительностью 10 секунд (в соответствии с рекомендациями от Apple).
    2. Конвертировать его в нужный формат (MPEG-4 в транспортном контейнере от MPEG2)
    3. Обновить плейлист
    4. Вернуться к пункту 1


    Теперь, как были реализованы эти пункты алгоритма.

    Получать видеофрагменты нужной длительности мы решили с помощью утилиты dvgrab – она зарекомендовала себя с хорошей стороны при круглосуточной работе в системе видеоархива у того же телевидения. Разумеется, сохранять 10-секундные видеофрагменты приходится прямо в оперативную память, на RAM-диск. 10 секунд несжатого видео занимает 35 мегабайт. Сжатый фрагмент занимает примерно 1.2 Мегабайта при битрейте 800kbps.

    Конвертировать видеофрагменты решено было при помощи ffmpeg-а — он также довольно-таки давно и прочно поселился в системе того же видеоархива телевидения благодаря своей универсальности. В качестве кодека используется свободная реализация H264 – x264.

    Сама система, которая следит за поступлением новых видео фрагментов, запускает конвертирование и обновляет плейлист (при этом, видеофрагменты в плейлисте представляют собой так называемое «окно» — в самом плейлисте хранится только 3 фрагмента, на диске — 10) была написана на Bash-е.

    Собственно, вот этот код:

    #!/bin/bash
    #set -x

    VIDEO_FILES=( ); # array to store all available *.ts files at the moment
    VIDEO_FILES_MAX=10; # how many elements can be stored in $VIDEO_FILES array
    LIST_LEN=0; #*.ts list length

    VIDEO_WINDOW=""; # array to store current video files window
    VIDEO_WINDOW_LEN=3; # how many files we are storing in the window

    LAST_CONVERTED=0; # ID of last converted video slice

    RAW_SLICES_PATH="/tmp/DV/"; # where to look for raw video slices
    MP4_SLICES_PATH="/tmp/MP4/"; # where to place converted chunks
    MP4_SLICES_WEBPATH="http://istream.jurnaltv.md/live/"; # web path from the user`s POV
    SLICE_DURATION=10; # seconds, 10-15 seconds recomended by Apple
    M3U_FILE_NAME="/tmp/MP4/live.m3u"; # full path to the m3u index file

    FFMPEG_CMD="/usr/local/bin/ffmpeg -y -i ";

    update_m3u() {
    # updating number of elements
    LIST_LEN=${#VIDEO_FILES[@]};
    echo "Number of elements in array is: $LIST_LEN ";
    echo -n "(";
    for slice in ${VIDEO_FILES[@]}
    do
    echo -n "${slice} ";
    done
    echo ")";
    echo;
    # getting last $VIDEO_WINDOW_LEN files from array
    let LAST_IDX=LIST_LEN-VIDEO_WINDOW_LEN;
    if [ $LAST_IDX -le 0 ]
    then
    LAST_IDX=0;
    fi
    echo "Last index we must use is $LAST_IDX";
    # recreating m3u file
    # getting slice id from $LAST_CONVERTED
    SLICE_ID=0;
    let SLICE_ID=LAST_CONVERTED-VIDEO_WINDOW_LEN;
    if [ $SLICE_ID -le 0 ]
    then
    SLICE_ID=0;
    fi
    echo "------------- DUMP START ------------- ";
    echo "#EXTM3U">$M3U_FILE_NAME;
    echo "#EXT-X-TARGETDURATION:$SLICE_DURATION">>$M3U_FILE_NAME;
    echo "#EXT-X-MEDIA-SEQUENCE:$SLICE_ID">>$M3U_FILE_NAME;
    i=$LAST_IDX;
    while [ $i -lt $LIST_LEN ]; do
    echo "#EXTINF:${SLICE_DURATION},">>$M3U_FILE_NAME;
    echo "${MP4_SLICES_WEBPATH}${VIDEO_FILES[${i}]}">>$M3U_FILE_NAME;
    let i++;
    done
    echo "------------- DUMP END ------------- ";

    # if array length is greater than $VIDEO_FILES_MAX - remove first element and compact array: array=( "${array[@]}" )
    if [ $LIST_LEN -ge $VIDEO_FILES_MAX ]
    then
    echo "Packing array by removing first element";
    echo ${MP4_SLICES_PATH}${VIDEO_FILES[0]};
    rm -f ${MP4_SLICES_PATH}${VIDEO_FILES[0]};
    unset VIDEO_FILES[0];
    VIDEO_FILES=( "${VIDEO_FILES[@]}" );
    fi
    echo "-------";
    }

    # gracefly handle SIG_TERM
    on_sigterm() {
    echo "Got sigterm, exiting!";
    RUN="0";
    }

    trap 'on_sigterm' TERM

    # cleanup source and converted folders
    rm -f ${RAW_SLICES_PATH}*.dv;
    rm -f ${MP4_SLICES_PATH}*.dv;

    # forever do
    # convert video
    # move to MP4
    # erase original
    # add converted to the tail of array
    # update live.m3u file for $VIDEO_WINDOW_LEN files
    # if array len>$VIDEO_FILES_MAX
    # then remove first element from array and compact array it
    # forever end

    RUN="1";
    raw_slice="";

    while [ $RUN -eq "1" ]; do
    #getting oldest file from the list of slices
    raw_slice=`ls -tr ${RAW_SLICES_PATH}|head -1`;
    if [ "$raw_slice" != "" ];
    then
    OPEN_FLAG=`lsof|grep $raw_slice|wc -l`;
    if [ $OPEN_FLAG -eq 0 ];
    then
    #converting video
    echo "Converting ${raw_slice}">>/tmp/istream.txt
    #sleep 6; # simulating transcoding delay
    mp4_slice="live-${LAST_CONVERTED}.ts";
    $FFMPEG_CMD ${RAW_SLICES_PATH}${raw_slice} -acodec libfaac -ac 1 -ar 48000 -ab 96k -vcodec libx264 -vpre baseline -vpre fast -vpre ipod640 -b 800k -g 5 -async 25 -keyint_min 5 -s 512x256 -aspect 16:9 -bt 100k -maxrate 800k -bufsize 800k -deinterlace -f mpegts ${MP4_SLICES_PATH}${mp4_slice}
    rm -f ${RAW_SLICES_PATH}$raw_slice
    LIST_LEN=${#VIDEO_FILES[@]};
    VIDEO_FILES[${LIST_LEN}]=$mp4_slice;
    #generating m3u file
    let LAST_CONVERTED++;
    update_m3u;
    else
    sleep 1; # sleep one second
    echo "Waiting for file to be closed!";
    fi
    else
    sleep 1; # sleep one second
    echo "Sleeping!";
    fi



    Код может быть несколько не оптимальным, тут есть простор для оптимизации и модификаций (например, можно сделать 2-3 потока с разными битрейтами), но этот код работает — и при таком подходе совершенно отпадает нужда в утилитке-сегментере.

    К сожалению, доступен этот видеопоток только для тех, кто подключён к MDX – т.е. только для пользователей из Молдовы, но по отзывам той тысячи с хвостиком пользователей, которые пользуются этим сервисом — им нравится «носить с собой маленький телевизор».

    С удовольствием отвечу на вопросы сообщества.

    P.S. Спасибо нашему офис-менеджеру Татьяне за согласие попозировать с планшетом, а директору по маркетингу за то, что поработал фотографом :).

    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 65

      +4
      Linux way во всей красе.
        –3
        Ну-ну, попробовали вы копнуть чуть глубже в этом направлении и шишек отхватили бы, так что говорить о всей красе не совсем корректно
          +3
          Шишек действительно хватает — одни только пляски с опциями того же ffmpeg-а в некоторых случаях точно требуют бубна. Но сам по себе подход «одна прога — одна задача» меня вполне устраивает.
            0
            А когда идет масштабирование, то по любому начинаются проблемы, даже с одной прогой. VLC не хочет переживать свой же поток с другого сервера. Память в vlc регулярно «подтекает». Проблемы все решаемы, но нужно не один месяц, знаем по себе. Но в целом, очень хорошо, что есть такие тулзы
              +7
              Про VLC хочу написать отдельную статью — у меня ушло примерно 4 месяца на эксперименты, в результате которых получилось сделать сборку, которая работает без перезагрузок с ноября — каждая нода спокойно тянет 1000 мегабитных потоков (да-да, гигабит в секунду).

              Вкратце — хардварный кодер (QVidium) отдаёт поток на 9 мегабит по RTP, менеджмент-сервер при помощи VLC его транскодирует на 2 мегабита и раздаёт по RTSP нодам, которые уже на мегабите по HTTP раздают поток клиентам (при помощи того же VLC). Вот тут можно посмотреть — только в основном все передачи на румынском, хотя бывают и на русском: www.jurnaltv.md/ro/live/

              Узлы для внешних пользователей находятся в Германии, для молдавских — в Молдове.
                +1
                У нас примерно такая же схема, только еще wowza. Ждем тогда статью, почитаем
                  0
                  Кстати про ноду и 1000, так загрузить можно ее без проблем, даже с глюками VLC. Тут ведь в основном ограничения процессорного времени и объема ram
                    0
                    По секрету — всё гораздо проще — у немцев обычно все сервера с одной сетевухой, которая даёт максимум 1 гигабит :)
                    0
                    Это шикарные результаты, кстати. VLC вообще не отличается способностями стриминг-сервера.
                      0
                      Вот, с немецкой ноды статистика, если вам это что-то скажет:

                      ~$ uptime
                      22:56:27 up 95 days, 23:43, 1 user, load average: 1.18, 0.98, 0.92

                      top:

                      PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
                      13515 vlc 20 0 1014m 94m 9108 S 29 0.8 45333:49 vlc

                      $ free
                      total used free shared buffers cached
                      Mem: 12324132 1057900 11266232 0 285836 291632
                      -/+ buffers/cache: 480432 11843700
                      Swap: 16000632 0 16000632

                      ~$ dpkg -l|grep vlc
                      ii vlc vlc-1.0.5-20100923-JTV-1 VLC build for JTV

                      $ vlc --version
                      VLC media player 1.0.5 Goldeneye
                      VLC version 1.0.5 Goldeneye
                      Compiled by root@mr01.
                      Compiler: gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
                      This program comes with NO WARRANTY, to the extent permitted by law.
                      You may redistribute it under the terms of the GNU General Public License;
                      see the file named COPYING for details.
                      Written by the VideoLAN team; see the AUTHORS file.

                        0
                        и сколько при этом пользователей?
                        Все MPEG-TS?
                          0
                          Нет, это mp4 — это для флэша, ответ был про VLC. В среднем — ночью 160 человек, днём — в среднем 600, каждый клиент — около мегабита (зависит от картинки, там плавающий битрейт). Во время выборов каждая нода (и эта конкретно) стабильно держали 1000-1200 человек одновременно, т.е. мы под завязку забивали по 1 гигабиту на сервер. Немцы даже письмо прислали — мол, товарищи, у вас такой траффик, вы там никого не досите случаем? Но объяснения по поводу выборов приняли и никаких проблем не было.
                            0
                            Не понял насчёт mp4. Это файловый контейнер, а вы наверное всё таки поток отдавали?
                              0
                              А, да, пардон — спал мало сегодня. Контейнер flv, который снаружи видится как бесконечный файл (можно стягивать wget-ом), внутри там обычный x264.
                              Вы можете сами стянуть кусочек — или скормите линк 178.63.96.135:80/channel0.flv тому же FlowPlayer-у.
                              0
                              Ночью/днём — это на каждую ноду, разумеется. Сейчас она одна, так как формат меняется и внешние пользователи через пару дней уже не смогут смотреть картинку — обычные телевизионные заморочки с правами и лицензиями.
                              Внутри страны мы ограничены только пропускной способностью MDX-сети (и оборудования) — сейчас это 10 гигабит, но один толстый провайдер божится, что совсем скоро будет 300 гигабит. Правда, божится уже год как, но рано или поздно упрётся в лимит.
                      0
                      Про vlc интересно. Правда, если использовать старенький 0.9, то вроде не течет.
                        0
                        Он очень старый для текущих потребностей, с версии 1.1.*, если не ошибаюсь, улучшили h264 и т.п. Так что невозможно вернуться назад. ДА и вообще на разных системах все ведет себя по разному, centos, fedora, решил сапорт свежие поставить, и пошли несовместимости и ручная сборка vlc :)
                          0
                          до версии 1.1.непомню (точнее в changelog) — просто было тупо сломано http-ts-вещание.

                          теперь вроде нормально в теории, а на практике жопа какая-то. жду статьи, надо экспериментировать.
                            0
                            Пользовались до 1.1 http, работало
                              0
                              1.1.2 — TS and DVB demuxing fixes

                              Changes between 1.1.0 and 1.1.1:
                              Stream output:
                              * Fix h264 streaming in ts

                              не пахало.

                              в 0.9.x — пахало.
                                0
                                Черт я немного перепутал ветки, все правильно
                      0
                      Это да. Причем часто надо брать ffmpeg конкретной, свежей, ревизии :)
                      Но частьопций, к примеру, для apple streaming, расписана самим Apple.
                      +1
                      Если источник один с известными свойствами, то и проблем никаких, шишки это если кодить из всего подряд в поток единого формата, с моей точки зрения.
                        0
                        Было бы здорово, чтобы так было. Но не всегда все так гладко, ведь программы пишут люди
                          +2
                          Угу, при этом у разных людей может быть разное понимание стандарта — например, те же программеры из проекта x264 чуть-чуть по-другому понимают H264, чем инженеры из QVidium-а — в результате, поток, который даёт железячка не всегда переваривается VLC с этим кодеком — несмотря на то, что в доке от железки тестировать рекомендуют при помощи того же VLC. Вот такие пирожки с котятами :)
                      +2
                      Может, всё-таки, UNIX-way?
                        0
                        Вы правы.
                      0
                      >не буду называть имён производителей, так как NDA
                      Уже секретно даже название?
                        0
                        Ну я же цену назвал ;-) Тут надо было либо имена производителей, либо цены. К тому же могли счесть рекламой. В гугле их легко найти — если в описании системы на сайте цена не указана — то это они и есть :)
                          0
                          Цена по nda, что может быть комичнее :)
                            +2
                            Дык по NDA нельзя разглашать, что у компании ХХХ продукт стоит ZZZZ денег. Я согласовал всё разглашение — я могу назвать диапазон, но не могу назвать имён компаний. А то как бы получится обвинение в том, что они толкают аналог моего скрипта за кучу денег. Скандал-с будет. А так — я назвал диапазон, но ни одной компании, а те, кто работают в индустрии — наверняка смогут связать одно с другим :)
                        +1
                        Давно не было такой явной КДПВ. :)
                          +3
                          Татьяне, баааальшой привет!
                            –1
                            Да, видно под танцами с бубном многие понимают разные бубны;)
                              –2
                              Че за баба?
                                0
                                Мне интересно, кто делал онлайн стриминг PublikaTV и почему он тормозит из-за пределов Мд.
                                  +3
                                  Лепесин делал, все вопросы к ним. С ними вообще был забавный случай — они объявили о том, что оно скоро будет, мы про это узнали и без всяких объявлений сделали раньше, начав делать позже. Так сложились обстоятельства, что и в аппсторе нас почему-то раньше заапрувили. Често-честно, я Джобсу не писал и не звонил :)
                                  –1
                                  Призываю в топик erlyvideo! Есть же специальные видеостриминговые серверы для этого… Почему решили их не использовать?
                                    0
                                    А зачем?

                                    И какой сервер (кроме самого DSS) «искаропки» поддерживает такое видео? А коммерческие решения мы рассматривали в последнюю очередь. К тому же, этот вариант простой, как веник — там ломаться нечему :)
                                      0
                                      Когда DSS научился раздавать HLS? Он же вообще заброшен эпплом.
                                        0
                                        Да были вроде какие-то доработки умельцев — я сам мучал, но у меня оно то не запускалось, то валилось — поэтому я поковырялся, плюнул, и занялся изобретением собственного велосипеда.
                                        0
                                        Есть ещё gst-rtsp-server :) Вещает и перекодирует всё, что понимает гстример.
                                      0
                                      А зачем бить поток на кусочки, если передается только один поток? Ведь одна из главных задумок адаптивного HLS в возможности выбирать поток в зависимости от сигнала, загрузки устройства. Или у пользователей нет проблем с торможением видео?
                                      0
                                      Мы вот тоже наелись говна с этим http live streaming'ом. Фактически, написали свой сегментер — взяли свой рекордер и приделали к нему простенький скриптик для создания m3u8. Всё победили, но задержку в 30 секунд — ну никак не перепрыгнешь.
                                        0
                                        Мы в экспериментах добивались 12-15 секунд. Но меньше не имеет смысла из-за самой сути сжатия на основе GOP. Если клиенту объяснить про отставание картинки с самого начала — то проблем не возникает.
                                        Более того — отставание можно преподать как преимущество ;-)

                                        Даже аппаратные кодеки дают отставание в 1-3 секунды (правда, тот же QV даёт 0.5 секунды, но при работе 2-х устройств между собой по их собственному протоколу).
                                          0
                                          > Более того — отставание можно преподать как преимущество

                                          Реализация вещания на iOS развивает коммуникативные навыки! :-)

                                          > меньше не имеет смысла из-за самой сути сжатия на основе GOP

                                          В самих сегментах проблема — с GOP как раз проблем никаких, особенно если запретить b-frames (а их и надо запрещать для iOS).

                                          Вообще до сих пор не понимаю, зачем Эпплу было городить этот велосипедоогород, а не использовать, например, старый добрый RTSP-over-HTTP. Из преимуществ — ну разве что динамическое переключение потоков.

                                          Наверное, поэтому я там и не работаю. :-)
                                            0
                                            Зачем они всё это придумывали — хз, это надо у Джобса узнавать — но не думаю, что он расколется. Нам остаётся или смириться с тем, что есть и плясать под музыку Apple, или основать свой лунапарк с блэкджеком и далее по тексту, но пока нет пары лишних миллиардов — выбираем первое :)
                                        0
                                        MDX (высокоскоростная сеть внутри страны, к которой подключены все провайдеры и трафик в которой безлимитный)


                                        MD-IX (Moldova Internet Exchange) AS31580

                                        Вы сударь плохо сети понимаете. Это не «высокоскоростная сеть внутри страны», а точка обмена интернетом с бесплатным пирингом но взносом за обслуживание единицы используемой ёмкости (порта в 100, 1000, 10000 Mbit)

                                        Когда один из наших заказчиков (телевизионный канал, достаточно известный в Молдове и в Румынии — Jurnal TV) попросил нас реализовать подобную систему вещания для iPhone/iPad/iPod


                                        А по телику раскручивали как акт доброй воли и филантропии. Или я плохо понимаю как там дела обстоят.
                                          0
                                          >>Вы сударь плохо сети понимаете. Это не «высокоскоростная сеть внутри страны», а точка обмена интернетом с бесплатным пирингом но взносом за обслуживание единицы используемой ёмкости (порта в 100, 1000, 10000 Mbit)

                                          Это детали, которые тут врядли кого-то интересуют. Суть та же. Сеть высокоскоростная? Да. Внутри страны? Да. Анлим? Да. Больше деталей не требуется :)

                                          >>А по телику раскручивали как акт доброй воли и филантропии. Или я плохо понимаю как там дела обстоят.
                                          В репортаже, когда Драгош пришёл в гости в студию? Нет, он же чётко ответил на вопрос, откуда это всё поехало — сам журнал и попросил. Просто журналисты — они такие журналисты… :)
                                          0
                                          Кстати, можно самим не реализовывать вещание на iPhone, а взять услуги у операторов CDN (например, CDNvideo)
                                            0
                                            Ага, а вы себе хотя бы порядок стоимости их услуг представляете? У них траффик ещё дороже, чем у Амазона.
                                              0
                                              У CDNvideo — дешевле трафик, чем у Amazon:

                                              cdnvideo.ru/index.php?unikod=price

                                              aws.amazon.com/cloudfront/
                                                +1
                                                >>У CDNvideo — дешевле трафик, чем у Amazon:
                                                У них в заголовке страницы написано, что это для Рунета. Для Молднета это явно неактуально — у Jurnal TV только _внешний_ траффик (Европа/США) — более 60 терабайт в месяц. По Молднету немного больше, но тут его просто никто не учитывает, так как гигабитный порт стоит около 250 долларов в месяц (на 10 гигабит — 500) — это с анлим траффиком.

                                                Но для тех, кто организует подобное в России — ваша ссылка наверняка будет интересна. :)
                                                  0
                                                  На самом деле в CDNvideo там нет ограничения на трафик — он может быть и европейским.
                                                    0
                                                    Так cdnvideo даже на Российских ix не присутствует, что уже говорить о европе?
                                                    Связанность будет никакая.
                                                      0
                                                      На MSK-IX присутствует. На остальных российских IX трафик мал, так что ставить там сервера нет практического смысла. Лучше договариваться напрямую с операторами.
                                                        0
                                                        ага по поводу регион, и вашей политики вкурсе, мягко говоря не правильная, но это уже оффтоп :)
                                                        P.S: см. мртг ix
                                            0
                                            Мда. Тянуть в dv по 10 сек, кодировать ffmpeg-ом. ужас.

                                            В vlc с 1.2.0-dev появился access livehttp, который красиво бьет, кладет в файлы и обновляет m3u8
                                            Тут расписано

                                            Раз уже забираете через такую связку — пойдет
                                            что-то вроде vlc -vvv dv/rawdv:///dev/raw1394 --sout '#transcode{...}:std{access=livehttp{...}}" и все. Отдавать nginx-ом, хоть 10gbit.

                                              0
                                              О, прогресс не стоит на месте — как выйдет 1.2.0 — посмотрим и его, спасибо.
                                              0
                                              Таки доделали версию для Ипад-а?
                                                0
                                                Угу, она уже даже есть в аппсторе, если ты про приложение новостное — обновись. :)
                                                0
                                                Сейчас как раз столкнулся с вещанием на базе HLS.
                                                А как Вам удалось получить плавное проигрывание на IOS не указывая start offset для каждого ts чанка да и даже не указывая в m3u8 тег #EXT-X-DISCOUNTITY?

                                                А то я уже замучился подбирать параметры для ffmpeg. Ввиду невозможности указать start без использования внешних программ, приходится указывать EXT-X-DISCOUNTITY
                                                Но даже с ним при переходе на новый чанк видео все равно иногда дергается.
                                                  0
                                                  Да как бы вообще особо не заморачивались с этим — вот сейчас глянул:
                                                  cat live.m3u
                                                  #EXTM3U
                                                  #EXT-X-TARGETDURATION:10
                                                  #EXT-X-MEDIA-SEQUENCE:4936073
                                                  #EXTINF:10,
                                                  91.216.97.10/live/live-4936073.ts
                                                  #EXTINF:10,
                                                  91.216.97.10/live/live-4936074.ts
                                                  #EXTINF:10,
                                                  91.216.97.10/live/live-4936075.ts

                                                  А вот статус сервера (это бездисковая нода, всё в оперативке):

                                                  10:09:05 up 576 days, 14:48, 2 users, load average: 0.47, 0.47, 0.38

                                                  Так что даже не знаю, что посоветовать…

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое