Broadcasting ( организация собственных прямых трансляций на базе TS )

а возможно ли сделать при запуске собственной трансляции использование других контейнеров кроме MPEG-TS, например MP4/MOV ?

upd: смена ВНЕШНЕГО ip адреса влияет на трансляцию
сегодня после смены внешнего ip не зразу удалось запустить сервер…
подключение к трансляции стало дольше т.е до момента подключения к пирам проходит около 30 секунд
пиров стало не видно по адресу http://ip адрес:7764
точнее пишет:

downloading 1
иногда и вовсе пишет 0, раньше было всех пиров видно...

в новой версии нагрузка на проц стала меньше в 1.5 раза и о чудо сервер acestream не падает)

на узле поддержки иногда в логах проскакивает, но довольно редко:

Traceback (most recent call last):
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 287, in verify
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 359, in rsa_verify_data_pubkeyobj
  File "/usr/lib/python2.7/dist-packages/M2Crypto/RSA.py", line 255, in verify
    return m2.rsa_verify(self.rsa, data, signature, digest_type)
RSAError: bad signature
2012-12-08 19:00:29 sw::984292688cf0da2366418b6f244f94a2c9d89e71:piece_came_in: kicking peer
Traceback (most recent call last):
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 287, in verify
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 359, in rsa_verify_data_pubkeyobj
  File "/usr/lib/python2.7/dist-packages/M2Crypto/RSA.py", line 255, in verify
    return m2.rsa_verify(self.rsa, data, signature, digest_type)
RSAError: bad signature
2012-12-08 19:00:29 sw::984292688cf0da2366418b6f244f94a2c9d89e71:piece_came_in: kicking peer
BadDataGuard::failed: index 222 ip 91.78.105.57 bad[index] 1 len(bad) 1
2012-12-08 19:00:29 sw::984292688cf0da2366418b6f244f94a2c9d89e71:piece_came_in: kicking peer
Traceback (most recent call last):
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 287, in verify
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 359, in rsa_verify_data_pubkeyobj
  File "/usr/lib/python2.7/dist-packages/M2Crypto/RSA.py", line 255, in verify
    return m2.rsa_verify(self.rsa, data, signature, digest_type)
RSAError: bad signature
2012-12-08 19:00:29 sw::984292688cf0da2366418b6f244f94a2c9d89e71:piece_came_in: kicking peer
BadDataGuard::failed: index 219 ip 91.78.105.57 bad[index] 1 len(bad) 2
BadDataGuard::failed: index 220 ip 91.78.105.57 bad[index] 1 len(bad) 3
2012-12-08 19:00:31 downloader::try_ban: ip 91.78.105.57
node: name livefootball_ws_HD up 1158.9 down 259.2
node: name livefootball_ws_HD up 1126.1 down 254.7
Traceback (most recent call last):
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 287, in verify
  File "ACEStream/Core/Video/LiveSourceAuth.py", line 359, in rsa_verify_data_pubkeyobj
  File "/usr/lib/python2.7/dist-packages/M2Crypto/RSA.py", line 255, in verify
    return m2.rsa_verify(self.rsa, data, signature, digest_type)
RSAError: bad signature

при этом вроде на отдаче это не сказывается. По прежнему кушает очень много оперативной памяти, причем не сразу а постепенно растет потребление памяти. Также в вашей статистике stats.torrentstream.net перестал считаться node трафик, хотя сервер поддержки запущен и помогает трафиком
P.S. версия 2.0.2, убунту 11.10

Просьба решить проблему смены внешнего ip адреса, я думаю ip сохраняется на трекерах поэтому я не вижу пиров, либо это в плагине где-то сохраняется, но я не знаю где…
смена параметра – host не влияет никак

у node-сервера есть какое-то ограничение по скорости отдачи или количеству пиров? сервер просто явно недоотдает трафик, держится на уровне 30-35мбит с пиками до 40мбит/с, хотя потенциал раза в 2 выше, наблюдал в течении нескольких часов.
P.S. Стоит включить в node-сервер да и клиентам опцию передачи полученных потоков по http, чтобы можно было смотреть сторонними плеерами, например на определенный порт, указанный пользователем, повесить http-трансляцию, если это необходимо.

Подскажите с организацией трансляции.

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

В Vlc создаю поток с клипом в mpg2-ts или mp4-ts посылаю его с исходящими параметрами:

:sout=#std{access=http,mux=ts,dst=:8089/} или :sout=#http{mux=ffmpeg{mux=flv},dst=:8089/}

это трансляция без перекодирования. далее создаю в виндоусе через торрент стрим бродкастинг . и получаю на выходе трансляцию которая идет но постоянно заедает и выключается. при этом загрузка процессора и оперативы не более15 процентов.

а теперь непонятный для меня момент в том же Vlc создаю трансляцию с перекодированием с вот такими исходящими параметрами:

:sout=#transcode{vfilter={canvas{width=1280,height=720,aspect=16:9,no-padd}:adjust{contrast=1.17,brightness=1.05,saturation=1.2,gamma=0.97}},vcodec=h264,vb=1900,deinterlace,fps=25,acodec=mp3,ab=96,channels=2,samplerate=44100,venc=x264{vbv-bufsize=7000,vbv-maxrate=2100,ref=3,subme=3,keyint=25,idrint=25},sfilter={logo{file=C:/1.png,position=6,opacity=300}}}:std{access=http,mux=ts,dst=:8089/}}

и при тех же параметрах бродкастинга через торрент стрим видео идет хорошо и без заеданий, но загрузка процессора 99 процентов(большая часть уходит на перекодирование).
Вот и вопрос что я делаю неправильно? перепробывал перекодировать клип уже в десяток форматов и все равно без прямого перекодирования в влц, они все заедают в тс бродкастинге.

видимо у вас источник явно не mpeg2 или mpeg4, наверно пытаетесь засунуть avi в mpeg-ts без перекодирования, для нормальной трансляции нужно кодировать в mpeg2 или mpeg4(h264) с контейнером mpeg-ts, последний гораздо более качественный, но требует значительной производительности процессора, попробуйте например так:

:sout=#transcode{width=1024,height=576,vcodec=h264,vb=1900,deinterlace,fps=25,acodec=mp3,ab=96,channels=2,samplerate=44100,venc=x264{vbv-bufsize=5000,vbv-maxrate=2100,ref=1,subme=1,keyint=50},sfilter={logo{file=C:/1.png,position=6,opacity=300}}}:std{access=http,mux=ts,dst=:8089/}}

спасибо так работает и загрузка процессор держится в районе 60%. но интерестно было печему я не могу нормально запустить поток без transcode.
Вот снимок того во что я конвертирую видео до трансляции. и без строки transcode{width=1024,height=576,vcodec=h264,vb=1900,deinterlace,fps=25,acodec=mp3,ab=96,channels=2,samplerate=44100,venc=x264{vbv-bufsize=5000,vbv-maxrate=2100,ref=1,subme=1,keyint=50} оно начинае зависать в ТС(буферизация 0% или просто стоп и все)
без транскодо процессор держится совсем в 10-15%


вот к примеру сдел две трансляции одна с произвольными форматами и вот этой строкой предложенной выше vladimir29
:sout=#transcode{width=1024,height=576,vcodec=h264,vb=1900,deinterlace,fps=25,acodec=mp3,ab=96,channels=2,samplerate=44100,venc=x264{vbv-bufsize=5000,vbv-maxrate=2100,ref=1,subme=1,keyint=50},sfilter={logo{file=C:/1.png,position=6,opacity=300}}}:std{access=http,mux=ts,dst=:8089/}}

а вторая с перекодированным ранее видео в формат mpeg4-ts и с параметрами для вывода видео
:sout=#std{access=http,mux=ts,dst=:8089/}

и вторая у меня постоянно отключается, подскажите как запустить заранее перекодированное видео без стопов и чтобы прцессор не сильно загружало?

Никаких ограничений нет, но он и не должен выгребать весь канал, у нас наоборот стояла задача минимизировать объемы трафика с сервера поддержки, но пока мы решили ему оставить режим отдачи как у обычного клиента. Что по серверу поддержки будет добавлено/изменено, так это режимы входящих соединений и получения данных ( только с источника или с источника и с определенных узлов поддержки или с источника и любых пиров или с только с определенных узлов поддержки или др. компоновки )

P.S. Насчет выдачи пользователю потоков по http это отдельная тема и для этого мы создадим режим виртуального клиента, когда движок можно будет устанавливать и использовать удаленно, но нормально с ним работать смогут только те плееры и медиацентры, которые будут использовать API движка

Новые параметры для acestreamengine-stream/acestreamengine-node, начиная с версии 2.0.3 ( обновление от 15.12.2012)

acestreamengine-stream
Эта команда запускает источник трансляции

обязательные параметры
–name NAME - название трансляции (это название используется при создании файла acelive)
–source SOURCE - источник (ссылка на http поток)
–bitrate BITRATE - средний битрейт потока в байтах в секунду

необязательные параметры
–title TITLE - “читабельное” название транляции (это название выводится у клиентов). Если не задано, берется из --name
–destdir DESTDIR - устаревшний параметр, лучше использовать --cache-dir и --publish-dir
–cache-dir CACHE_DIR - папка для создания служебных файлов (кеш трансляции и другие)
–publish-dir PUBLISH_DIR - папка, в которой будет создан acelive-файл
–piecesize PIECESIZE - размер куска в байтах (если не задан, выставляется автоматически в зависимости от битрейта)
–duration DURATION - размер кеша трансляции в формат ЧЧ:ММ:СС (по умолчанию один час: 01:00:00)
–host HOST - вручную задать адрес локального трекера
–port PORT - порт, на котором работает движок
–skip-internal-tracker - отключить локальный трекер
–add-authorized-peers - добавить список авторизованных пиров в acelive файл
–private-source - сделать источник “приватным”
–support-node SUPPORT_NODE - добавить узел поддержки (в формате ip:port). Этот параметр может встречаться несколько раз, если нужно добавить несколько узлов поддержки.
–tracker TRACKER - добавить трекер (announce url). Этот параметр может встречаться несколько раз.
–trackers TRACKERS - старый формат добавления трекеров (список announce url через запятую)
–provider-key PROVIDER_KEY - ключ провайдера (только для коммерческих трансляций)
–maxclients MAXCLIENTS - максимальное количество пиров, на которые одновременно отдаются данные с источника
–show-pieces - выводить в лог номера кусков по мере их создания
–show-peers - периодически выводить в лог список подключенных пиров
–debug DEBUG - установить уровень отладки

дополнительно:
-h, --help - показать описание команд

Примечания:
“локальный трекер” - это трекер встроенный в источник трансляции. Если он не отключен опцией --skip-internal-tracker, то его адрес будет автоматически добавлен в acelive-файл.
“приватный источник” - это источник, который отдает данные только узлам поддержки, которые заданы опцией --support-node

Авторизованные пиры
Опция --add-authorized-peers добавляет в acelive-файл список пиров, которым клиент может “доверять” при подключении к трансляции. Это означает, что клиенту достаточно установить соединение с таким пиром, чтобы начать воспроизведение трансляции. Если клиент не подключен к авторизованному пиру, то для начала воспроизведение требуется наличие соединения минимум с двумя пирами. В список авторизованных пиров попадает источник трансляции (если это не приватный источник) и все указанные узлы поддержки.

Важно: клиенты со старыми версиями не понимают список авторизованных пиров в acelive-файле. Старые версии считают авторизованным пиром того, чей адрес совпадает с адресом первого трекера в списке трекеров. Раньше это всегда был локальный трекер. Теперь, когда появилась возможность отключения локального трекера, для поддержки старых клиентов мы рекомендуем при отключении локального трекера ставить на первое место трекер, расположенный на том же сервере, что и источник трансляции (чтобы адреса первого трекера и источника совпадали), либо использовать как минимум один узел поддержки (чтобы клиенты при старте могли установить соединение сразу с двумя пирами, даже если больше никто не смотрит трансляцию).

acestreaengine-node
Эта команда запускает узел поддержки

обязательные параметры
–url URL - ссылка на acelive файл трансляции

необязательные параметры
–port PORT - порт (по умолчанию 8621)
–state-dir STATE_DIR - папка для временных файлов (удаляется после остановки узла поддержки)
–source-node SOURCE_NODE - адрес источника трансляции (ip:port)
–support-node SUPPORT_NODE - добавить адрес другого узла поддержки (ip:port). Этот параметр может встречаться несколько раз.
–allow-source-download - разрешить получение данных от источника
–allow-support-download - разрешить получение данных от других узлов поддержки
–allow-peers-download - разрешить получение данных от обычных пиров
–max-incoming-connects MAX_INCOMING_CONNECTS - маскимальное кол-во входящих соединений (от других пиров) (по умолчанию 1000)
–max-outgoing-connects MAX_OUTGOING_CONNECTS - маскимальное кол-во исходящих соединений (к другим пирам) (по умолчанию 50)
–max-upload-slots MAX_UPLOAD_SLOTS - максимальное количество пиров, на которые одновременно отдаются данные с узла поддержки (по умолчанию 7)
–max-download-speed MAX_DOWNLOAD_SPEED - максимальная скорость загрузки (байт/с). По умолчанию 0 (без ограничений).
–max-upload-speed MAX_UPLOAD_SPEED - максимальная скорость отдачи (байс/с). По умолчанию 0 (без ограничений).
–show-pieces - выводить в лог номера кусков по мере их загрузки
–show-peers - периодически выводить в лог список подключенных пиров
–stats-report-interval STATS_REPORT_INTERVAL - задать интервал в секундах для вывода в лог информации о скорости загрузки/отдачи. По умолчанию 0 (не выводить).
–debug DEBUG - установить уровень отладки

дополнительно:
-h, --help - показать описание команд

что-то я недопонял, пробую запустить трансляцию TS по схеме приватный источник с одним сервером поддержки, который будет отдавать трансляцию пирам, запускаю на источнике:

acestreamengine-stream --name LF --source http://172.19.21.223:8090 --bitrate 200000 --private-source --support-node NODE_IP:7766 \
--trackers http://t1.torrentstream.net:2710/announce,http://t2.torrentstream.net:2710/announce \
--port 7766 --host MY_REAL_IP --destdir /media/F/stream1

запускаю на сервере поддержки:

acestreamengine-node --url http://MY_REAL_IP:7766/file?name=LF --port 7766 --state-dir /tmp \
--source-node MY_REAL_IP:7766 --allow-source-download --max-upload-slots 7 --stats-report-interval 7

по идее пиры должны получать поток от узла поддержки, так как сам сервер поддержки получает поток от источника “node: name LF up 0.0 down 213.6”, но выходит, что они вообще ничего не получают, не видят пиров, одной из причиной я считаю, то что сам трекер не отвечает по адресу MY_REAL_IP:7766 если ип и порт не указаны в
–support-node или в --add-authorized-peers, а соответственно они не могут подключиться к основному трекеру. Поправьте если я что-то делаю не так :slight_smile:

а можно пошагово где это все запускается (acestreamengine-stream)? для новичков.
и под какой операционоой системой.

Во-первых, нужно прописать в acelive-файл список “доверенных” узлов, чтобы клиенты знали, что узлу/узлам поддержки можно доверять. Для этого при запуске источника нужно добавить опцию --add-authorized-peers.

Во-вторых, При использования параметра --private-source желательно отключить локальный трекер опцией --skip-internal-tracker. При отключении локального трекера у старых клиентов могут возникнуть проблемы с подключением, если кроме узла поддержки никого нет на раздаче. Чтобы обеспечить поддержку старых клиентов, нужно развернуть какой-нибудь трекер (например, XBT Tracker) на сервере, где стоит узел поддержки, и поставить этот трекер на первое место в списке трекеров или использовать как минимум два узла поддержки.

P.S. Разные схемы запуска с примерами, с описанием вариантов построения оптимальной архитектуры при создании/организации трансляций, мы подготовим завтра

Подскажите как узнать ИД запущенной в линуксе трансляции, а то трансляция вроде идет а посмотреть как не знаю.
до этого запускался постоянно под виндой и там в браузере как по мне было легче узнать

на данный момент можно узнать создав страницу html с кодом плеера, содержание примерно такое:

<!DOCTYPE html>
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Torrent Stream</title>

<style type="text/css">
* {
    font-family: Arial;
}
body {
    background-color: #222
}
.modal {
    background-color:#fff; 
    display:none; 
    width: 500px; 
    padding:15px; 
    text-align:left; 
    border:2px solid #333; 
    font-size: 12px;
    
    opacity:0.8;
    -moz-border-radius:6px;
    -webkit-border-radius:6px;
    -moz-box-shadow: 0 0 50px #ccc;
    -webkit-box-shadow: 0 0 50px #ccc; 
}

.modal input {
    font-size: 12px;
}

.button-long {
    display: inline-block;
    background: transparent url(http://static.torrentstream.org/htmlplayer/img/sprite-player-black.png) no-repeat 100% -129px;
    height: 27px;
    line-height: 24px;
    cursor: pointer;
    position: relative;
    margin-left: 17px;
    top: -3px;
    padding-right: 12px;
    width: 115px;
    text-align: center;
    color: #fff;
    text-decoration: none;
    font-size: 14px;
}

.button-long b {
    background: transparent url(http://static.torrentstream.org/htmlplayer/img/sprite-player-black.png) no-repeat -579px -129px;
    height: 27px;
    width: 17px;
    position: absolute;
    left: -17px;
}

</style>

<!-- black style -->
<link type="text/css" rel="stylesheet" href="http://static.torrentstream.org/jsapi/css/ts-controls-black.css" />

<!-- api files -->
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/ts/core.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/jquery/jquery-1.7.min.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/jquery/jquery-ui-1.8.9.custom.min.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/jquery/jquery.mousewheel.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/jquery/jquery.jscrollpane.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/jquery/jquery.scrollText.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/jquery/jquery.easing.1.3.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/cufon/cufon.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/cufon/a_LCDNova_400.font.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/ts/player.js"></script>
<script type="text/javascript" src="http://static.torrentstream.org/jsapi/js/lib/ts/controls.js"></script>

<script type="text/javascript">
function init() {
    var useInternalControls = true;
    
    var controls = new TorrentStream.Controls("tsplayer", {
            style: useInternalControls ? "internal" : "ts-black",
            debug: true
    });
    
    try {
        var player = new TorrentStream.Player(controls.getPluginContainer(), {
                debug: true,
                useInternalControls: useInternalControls,
                bgColor: "#000000",
                fontColor: "#ffffff",
                onLoad: function() {
                    this.registerEventHandler(controls);
                    controls.attachPlayer(this);
                    try {
                        var p = this;
                        this.loadTorrent("file:///C:/Users/Vladimir/Desktop/vlc/Torrent%20Stream/LF.acelive");
                    }
                    catch(e) {
                        console.log("init: " + e);
                    }
                }
        });
    }
    catch(e) {
        controls.onSystemMessage(e);
    }
}
</script>

</head>

<body>

    <div id="player_container" style="background-color: #000; width: 800px; height: 483px; margin: 100px auto 0 auto;">
        <div id="tsplayer" style="width: 100%; height: 100%; color: #fff; text-align: center;">
            <div style="padding-top: 232px; background-color: #000000;">Подождите, идет загрузка плеера...</div>
        </div>
    </div>

    <script type="text/javascript">
    init();
    </script>
    
</body>
</html>

в этом коде в строке this.loadTorrent(“file:///C:/Users/Vladimir/Desktop/vlc/Torrent%20Stream/LF.acelive”); пишете адрес вашего acelive файла. Далее просто открываете эту страницу в браузере и смотрите ID, щелкнув правой кнопкой по плееру.
P.S. Кстати пора бы уже сделать вывод непосредственно ID трансляции в TS при ее запуске, а то жутко не удобно использовать выше описанный способ

Сегодня мы выпустили версию 2.0.7 с функцией Time Shift , для ее нормальной работы также необходимо обновить движок источника

Время, на которое может осуществляться перемотка назад, задается при создании трансляции опцией --duration. Время указывается в формате ЧЧ:ММ:СС. Например, при указании опции --duration 00:30:00 будет задан интервал 30 минут. ( в предыдущих версиях движка данный параметр работает не корректно )

P.S. Также хочу напомнить, что с детальной информацией по организации трансляций можно ознакомится в соответствующем разделе Wiki, на нашем сайте http://wiki.acestream.media/Streaming#Timeshift

Завтра

Личку игнорируют… пишу тут

Сделал ещё несколько тестов по раздаче потоков из Win 7 x64, тоже самое и в Висте x32
Получил такие вот результаты:

Желтое - входящий локальный сигнал
Красное - исходящий, первый на прямую из VLC, второй тот же поток, но через TS.

4 Мбит/с в Омск

http://img-fotki.yandex.ru/get/4122/65025181.3/0_9483b_1e764ed1_XL

7 Мбит/с в другую точку

http://img-fotki.yandex.ru/get/3711/65025181.3/0_9483d_439c51ff_XL

Константин, готов провести с вами, или кем-то ещё, те же опыты… напишите когда Вы будете готовы…

Пур, я не игнорирую, просто я не такой трудоголик как ты и просто не смотрел личку :wink:

Может я еще не отошел от праздника, но я не пойму что я должен увидеть на этих скринах!? ???

Насчет теста я тебе уже не раз говорил и сам предлагал, конечно давай проведем ( дай мне один поток трансляция по HTTP, а другой по P2P, и посмотрим что там вида будет вытворять), но только давай это уже сделаем во вторник. Ок?