sid99
Newbie
Оффлайн
Сообщений: 6
|
 |
« Ответ #11 : 05 Сентябрь 2013, 17:56:22 » |
|
допилена версия в 1 скрипт и файл с параметрами, запускает трансляцию при запросе, при отсутствии подключенных клиентов в течение минуты останавливает трансляцию, также проверяет на предмет существующей трансляции и если таковая имеется - соответственно редирект на нее.:
a.php:
<?php include "./config.php"; $hash = $_GET[id]; // Проверяем существует ли файл трансляции, если да - то сразу редиректим на URL из файла и заканчиваем работу if(file_exists($dir . "/" . $hash)) { $fstream = fopen($dir . "/" . $hash, "r"); $contents = fread($fstream, filesize($dir . "/" . $hash)); echo "Translation exist: " . $contents . "\r\n"; echo "Redirecting ...\r\n"; fclose($fstream); header("Location: " . $contents); exit(0); } //limits ... set_time_limit(0); ignore_user_abort(true); ob_start(); //соедниение с 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); // Если этот этап уже проходил - он не нужен ... пропускаем ... if(!$s) { fwrite($ace_sock, "START PID " . $hash . " 0\r\n"); $s = true; } //читаем URL из вывода acestreamengine-client $url = fread($ace_sock, 128); //выдергиваем ... if(preg_match("/START http/i", $url)) { $ace_url = explode(' ', $url); $ace_url = $ace_url[1]; //log сообщение URL'а от acestreamengine-client echo $ace_url . "\r\n"; //открываем соединение к консоли VLC, и проверяем не открывали ли мы его ранее ... if(!$vlc_s) { $vlc_s = true; $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 usleep(10000); echo fgets($vlc_sock, 128) . "\r\n"; usleep(10000); // Определяем порт для VLC $start_port = explode("-", $vlc_out_ports); $end_port = $start_port[1]; $start_port = $start_port[0]; $vlc_out_port = rand($start_port, $end_port); //организовываем streaming } if($ace_url) { $vlc_name_stream = $hash . "-" . md5($vlc_out_port); $vlc_cmd = "new " . $vlc_name_stream . " broadcast enabled\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo $vlc_cmd . "\r\n"; echo fgets($vlc_sock, 128) . "\r\n"; usleep(10000); $vlc_cmd = "setup " . $vlc_name_stream . " input " . $ace_url . "\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo $vlc_cmd . "\r\n"; echo fgets($vlc_sock, 128) . "\r\n"; usleep(10000); $vlc_cmd = "setup " . $vlc_name_stream . " output #std{access=http,mux=ts,dst=:" . $vlc_out_port . "/" . $vlc_name_stream . "}\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo $vlc_cmd . "\r\n"; echo fgets($vlc_sock, 128) . "\r\n"; usleep(10000); $vlc_cmd = "control " . $vlc_name_stream . " play\r\n"; fwrite($vlc_sock, $vlc_cmd); //log сообщение в STOUT echo $vlc_cmd . "\r\n"; echo fgets($vlc_sock, 128) . "\r\n"; // Формируем URL $vlc_out_url = "http://" . $vlc_out_host . ":" . $vlc_out_port . "/" . $vlc_name_stream; // Редиректим на URL полученный от VLC header("Location: " . $vlc_out_url); // Говорим плееру, что закончили, но продолжаем выполнение скрипта ... $length = ob_get_length(); header("Connection: close"); header("Content-Length: " . $length); header("Content-Encoding: none"); header("Accept-Ranges: bytes"); ob_end_flush(); ob_flush(); flush(); //log сообщение в STOUT echo $vlc_out_url . "\r\n"; echo "http://" . $vlc_out_host . ":" . $vlc_out_port . "/" . $hash . "\r\n"; // Создаем файл трансляции, вдруг кто еще захочет смотреть именно этот канал echo "Translation doesn't exist... Creating ... \r\n"; $f_url = fopen($dir . "/" . $hash, "a+"); fwrite($f_url, $vlc_out_url); fclose($f_url); } } // Проверяем не отключился ли клиент, если отключился - закрываем трансяции и сидирование (что плохо, но канала на все каналы не хватит ... =( ). while(true) { sleep(60); if(!exec('lsof -i tcp:' . $vlc_out_port . ' | grep "ESTABLISHED"')) { fwrite($ace_sock, "STOP\r\n"); fwrite($ace_sock, "SHUTDOWN\r\n"); fclose($ace_sock); echo "Stopping VLC " . $hash . "\r\n"; fwrite($vlc_sock, "del " . $vlc_name_stream . "\r\n"); fwrite($vlc_sock, "quit\r\n"); fclose($vlc_sock); echo "Deleting file " . $dir . "/" . $hash . "\r\n"; unlink($dir . "/" . $hash); exit(0); } } } } }
?>
config.php:
<?php // Пользователь от которого работает http-сервер $apache_user = "www-data"; // Пароль для telnet vlc сессии $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_ports = "10000-20000"; // Хост на котором запущен 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"; // Директория для файлов трансляций $dir = "./streams"; ?>
скрипт запуска VLC и acestreamengine: 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 infinity' sleep 1 echo "Starting ACEStreamengine ..." su www-data -c 'nohup /usr/bin/acestreamengine-client-console & 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}'` ;; *) echo " * Usage: ./stream_tv.sh {start|stop}" esac
нужно создать каталог $dir (в нем будут храниться файлы трансляций с URL трансляций внутри), соответственно дать права на него пользователю, от которого работает web-сервер.
|