допилена версия в 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-сервер.