Дополнительные продукты > Стол заказов

TS Restreamer

<< < (2/3) > >>

repsac:
сделал для себя такой рестример, использую в связке с mediatomb.
пришлось немного помучиться, пока понял почему трансляция на телевизоре прерывается, потом заметил, что на HD каналах прерывается меньше, дальше уже было дело техники. Написал на чистом С, под linux, на виндовсе собирается и работает под  cygwin.


моя первая программа на C.

Пур Иванов:
Реализация Торрент ТВ тут http://torrent-tv.ru/local_ts_proxy.php

sid99:

--- Цитата: Пур Иванов от 15 Августа 2013, 17:42:30 ---Реализация Торрент ТВ тут http://torrent-tv.ru/local_ts_proxy.php

--- Конец цитаты ---
Написал скрипт, тут: http://oldforum.acestream.media/index.php?topic=1493.msg8484#msg8484 описал процесс как и что происходит, если интересно конечно ...

Constantin:

--- Цитата: sid99 от 03 Сентября 2013, 20:46:29 ---
--- Цитата: Пур Иванов от 15 Августа 2013, 17:42:30 ---Реализация Торрент ТВ тут http://torrent-tv.ru/local_ts_proxy.php

--- Конец цитаты ---
Написал скрипт, тут описал процесс как и что происходит, если интересно конечно ...

--- Конец цитаты ---

Ну конечно это будет интересно! Выкладывайте на githab, если хотите чтобы сторонние разработчики подтянулись и внесли свою лепту.

sid99:

--- Цитата: Constantin от 04 Сентября 2013, 00:45:48 ---
--- Цитата: sid99 от 03 Сентября 2013, 20:46:29 ---
--- Цитата: Пур Иванов от 15 Августа 2013, 17:42:30 ---Реализация Торрент ТВ тут http://torrent-tv.ru/local_ts_proxy.php

--- Конец цитаты ---
Написал скрипт, тут описал процесс как и что происходит, если интересно конечно ...

--- Конец цитаты ---

Ну конечно это будет интересно! Выкладывайте на githab, если хотите чтобы сторонние разработчики подтянулись и внесли свою лепту.

--- Конец цитаты ---
Не нашел github, поэтому выложил сюда ...
Все написано на PHP, старался максимально комментировать - я, вообще, не программист, так на энтузиазме, было просто интересно, так что сильно не пинайте ...

Так что вот, на Ваш суд ...

ace.php:

--- Код: ---#!/usr/bin/php
<?php
include "./config.php";
//соедниение с acestreamengine-client
$ace_sock = fsockopen($ace_host, $ace_port, $errno, $errstr, 30);
if (!$ace_sock) {
    echo "$errstr ($errno)<br />\n";
} else {
        //timeout's
        stream_set_timeout($ace_sock, 5);
        stream_set_blocking($ace_sock, false);
        //Рукопожатие с acestreamengine-client
        $out = "HELLOBG\r\n";
        fwrite($ace_sock, $out);
        while(!feof($ace_sock))
        {
        usleep(80000);
        //ждем в цикле появления cmd-файла, и в работу его, ежели появился
        if(file_exists($ace_cmd_file))
            {
                $cmd = file($ace_cmd_file, true);
                //читаем cmd-файл
                foreach($cmd as &$_cmd)
                {
                print $_cmd . "\r\n";
                $hash = explode(' ', $_cmd);
                $hash = $hash[2];
                //останавливаем предыдущий канал
                fwrite($ace_sock, "STOP\r\n");
                //запускаем новый из cmd-файла
                fwrite($ace_sock, $_cmd . "\r\n");
                }
                //удаляем cmd-файл
                unlink($ace_cmd_file);
        }
        //читаем URL из вывода acestreamengine-client
        $url = fread($ace_sock, 128);
        //выдергиваем ...
        if(preg_match("/START /i", $url))
        {
        $red_url = explode(' ', $url);
        //log сообщение URL'а от acestreamengine-client
        echo $red_url[1] . "\r\n";
        //открываем соединение к консоли VLC
        $vlc_sock = fsockopen($vlc_host, $vlc_port, $errno, $errstr, 30);
            if (!$vlc_sock) {
                echo "$errstr ($errno)<br />\n";
            } else {
                //timeout's
                stream_set_timeout($vlc_sock, 5);
                stream_set_blocking($vlc_sock, false);
                //вводим password для доступа к VLC
                fwrite($vlc_sock, $vlc_pass . "\r\n");
                //log сообщение в STOUT
                echo fgets($vlc_sock, 128);
                usleep(10000);
                //удаляем все вещание ваапще
                $vlc_cmd = "del all\r\n";
                fwrite($vlc_sock, $vlc_cmd);
                //log сообщение в STOUT
                echo fgets($vlc_sock, 128);
                usleep(10000);
                //организовываем новое
                $vlc_cmd = "new " . $hash . " broadcast enabled\r\n";
                fwrite($vlc_sock, $vlc_cmd);
                //log сообщение в STOUT
                echo fgets($vlc_sock, 128);
                usleep(10000);
                $vlc_cmd = "setup " . $hash . " input " . $red_url[1] . "\r\n";
                fwrite($vlc_sock, $vlc_cmd);
                //log сообщение в STOUT
                echo fgets($vlc_sock, 128);
                usleep(10000);
                $vlc_cmd = "setup " . $hash . " output #std{access=http,mux=ts,dst=:" . $vlc_out_port . "/" . $hash . "}\r\n";
                fwrite($vlc_sock, $vlc_cmd);
                //log сообщение в STOUT
                echo fgets($vlc_sock, 128);
                usleep(10000);
                $vlc_cmd = "control " . $hash . " play\r\n";
                fwrite($vlc_sock, $vlc_cmd);
                //log сообщение в STOUT
                echo fgets($vlc_sock, 128);
                fclose($vlc_sock);
            //Созадем файл, который ждет a.php
        $f_url = fopen($ace_url_file, "a+");
        //пишем в него URL на который будет redirect плеера
        fwrite($f_url, "http://" . $vlc_out_host . ":" . $vlc_out_port . "/" . $hash);
        //log сообщение в STOUT
        echo "http://" . $vlc_out_host . ":" . $vlc_out_port . "/" . $hash;
        //закрываем файл для a.php
        fclose($f_url);
        //chown'им файл для a.php под пользователя, от которого работает веб-сервер, дабы он мог его удалить
        chown($ace_url_file, $apache_user);
            }
        }
    }
}
fclose($ace_sock);
?>

--- Конец кода ---

a.php:

--- Код: ---<?php
// Берем настройки
include "./config.php";
// Берем PID канала
$id = $_GET['id'];
// Создаем врмененный файл для acestreamengine-client-console
$f_cmd = fopen($ace_cmd_file, "a+");
// Пишем команду для acestreamengine-client-console в файл
fwrite($f_cmd, "START PID " . $id . " 0");
// Закрываем файл
fclose($f_cmd);
// Ждем в бесконечном цикле, пока отработает основной скрипт (ace.php) и создаст файл с URL от acestreamengine-client-console
while(true)
    {
    if($f_url = @fopen($ace_url_file, "r"))
            {
            // Читаем URL
            $url = fread($f_url, 256);
            // Закрываем файл
            fclose($ace_url_file);
            // Удаляем файл
            unlink($ace_url_file);
            // Редиректим на URL из файла
            header("Location: " . $url);
            // Останваливаем цикл
            break;
            }
    }
?>

--- Конец кода ---

config.php:

--- Код: ---<?php
// Пользователь от которого работает http-сервер
$apache_user = "www-data";
// Пароль для telnet vlc сессии, по default - admin
$vlc_pass = "admin";
// Хост на котором запущен vlc
$vlc_host = "127.0.0.1";
// Порт который слушает vlc
$vlc_port = "4212";
// IP на котором будет выходной поток vlc
$vlc_out_host = "192.168.100.2";
// Порт на котором будет выходной поток vlc
$vlc_out_port = "8903";
// Хост на котором запущен acestreamengine-client-console
$ace_host = "127.0.0.1";
// Порт который слушает acestreamengine-client-console
$ace_port = "62062";
// Временный файл для передачи параметров acestreamengine-client-console -> daemon (этот скрипт) -> vlc
$ace_url_file = "/var/www/tmp/ace.url";
// Временный файл для передачи параметров Smart-tv -> http-server (скрипт a.php) -> acestreamengine-client-console
$ace_cmd_file = "/var/www/tmp/ace.cmd";
//
?>

--- Конец кода ---

и скрипт запуска stream_tv.sh:

--- Код: ---#!/bin/bash
#
case $1 in
start)
        echo "Starting VLC ..."
        su www-data -c '/usr/bin/vlc-wrapper -d -I telnet --telnet-port 4212 --telnet-password admin'
        sleep 5
        echo "Starting ACEStreamengine ..."
        su www-data -c 'nohup /usr/bin/acestreamengine-client-console & 2> /dev/null'
        sleep 5
        echo "Starting ACE PHP ..."
        su www-data -c 'nohup ./ace.php & 2> /dev/null'
        ;;
stop)
        echo "Stopping ..."
        kill `ps ax | grep "acestreamengine" | grep -v "grep" | awk '{print $1}'`
        kill `ps ax | grep "start_engine" | grep -v "grep" | awk '{print $1}'`
        kill `ps ax | grep "vlc" | grep -v "grep" | awk '{print $1}'`
        kill `ps ax | grep "ace.php" | grep -v "grep" | awk '{print $1}'`
        ;;
*)
        echo " * Usage: ./stream_tv.sh {start|stop}"
esac

--- Конец кода ---

P.S.
Соответственно, для пользователя $apache_user, в моем случае это www-data - нужен валидный shell, правильнее было бы завести нового пользователя и запускать все от него ...

P.S.2.
HTTP-запрос должен быть, в моем случае, следующего вида: http://192.168.100.2:8903/a.php?id=<PID>

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии