TV를 원격으로 보기..(HDHomerun) Etc..

TV서버라고 하기엔 뭔가 허접한 제품을 구입(해외직구)

HD Homerun EXTEND라고 하는 물건

다 좋은데 내가 원하는 기능대로 쓰기엔 너무 부족한게 많음

PC나 스마트 폰에서 원격으로 보기위해서는 원격으로 재 전송 해줄 서버가 필요하다.

DLNA로 로컬네트워크로 쏘는 방식이라 외부접속가능한 DLNA지원 공유기가 있으면 되는데

이것도 공유기 값이 만만치 않음..

결국 서버를 이용하기로 하여 삽질끝에 방법을 찾았으나 케이블 방송이 송출방식을 QAM에서 8VSB로 바꾼게 너무 많음

일단 QAM으로는 Plex서버 이용하면 채널 검색부터 다 잘됨.

문제는 지상파및 요즘 HD방송은 전부 8VSB라는점..

그래서 VLC 플레이어를 활용하기로 함.


방식은  HDHomerun에서 스트리밍서버로 RTP전송, 전송받은 스트리밍서버는 VLC로 스트리밍 재전송(HTTP)

이때 재전송으로 인하여 화질 저하는 없으나 버퍼링은 좀더 생긴다. 대신 화질 선택을 할 수 있어 통신환경에 따라 전송량 제한도 가능하다..

남은건 이제..채널 선택방법..

웹페이지를 만들어 그곳에서 채널을 선택하는 방법으로 가닥을 잡고 웹페이지만들기 들어감

채널을 선택하면 hdhomerun의 채널 선택하도록 한 후 vlc의 스트리밍을 다시 적용하도록 함(vlc가 채널 바꿀때 서비스가 멈추게됨)

요렇게 자동화 하도록 웹페이지를 작성함.(아래, 윈도우서버계열)


뭔가 복잡하다...아무튼 페이지 만들어 채널별로 링크만들어주면 tv스트리밍 기능 동작

vlc플레이어 등 html스트리밍을 지원하는 플레이어 아무거나 다 동작.


Source IP : HD Homerun IP

APP IP : VLC 서비스 IP


설정 후 압축파일의 TVSerch를 이용하여 채널 검색    TVSerch.zip


채널 검색 후 웹페이지에서 선택 (PHP의 exec가 가능해야함..)

주소는

<?php
$source_ip="192.168.x.x"; //Hd Homerun주소
$app_ip="192.168.x.x"; //VLC서버 주소
$source_port="50000"; //HD Homerun 스트리밍 서비스 주소
$app_port="8080";    // VLC 스트리밍 주소

exec ("taskkill /F /IM vlc.exe /T");

if (empty($_GET["tuner"]))
 $tuner_get="";
else
 $tuner_get=$_GET["tuner"];

if (empty($_GET["prog"]))
 $prog_get="";
else
 $prog_get=$_GET["prog"];

if (empty($_GET["res"]))
 $res_get="";
else
 $res_get=$_GET["res"];


switch($tuner_get){
case "1":
 $tuner_set="tuner0";
 $source_port="50000";
 $app_port="8080";
 break;
case "2":
 $tuner_set="tuner1";
 $source_port="50001";
 $app_port="8081";
 break;
default:
 $tuner_set="tuner0";
 $source_port="50000";
 $app_port="8080";
 break;
}

$ch_datas="hdhomerun_config ".$source_ip." set /".$tuner_set."/channel 8vsb:".$_GET["channel"]."000000";
exec($ch_datas);

if($prog_get==""){
 $ch_datas="hdhomerun_config ".$source_ip." set /".$tuner_set."/program null";
}
else{
 $ch_datas="hdhomerun_config ".$source_ip." set /".$tuner_set."/program ".$prog_get;
}
exec($ch_datas);

exec("hdhomerun_config ".$source_ip." set /".$tuner_set."/target rtp://".$app_ip.":".$source_port." no_clear");

switch ($res_get){
 case "":
  $vlc_data="vlc.exe rtp://".$app_ip.":".$source_port." :sout=#transcode{vcodec=h264,vb=800,width=1280,height=720,acodec=mp3,ab=128,channels=2,samplerate=44100}:http{mux=ffmpeg{mux=flv},dst=".$app_ip.":".$app_port."/} :sout-keep";
  break;
 case "1":
  $vlc_data="vlc.exe rtp://".$app_ip.":".$source_port." :sout=#transcode{vcodec=h264,vb=600,width=640,height=360,acodec=mp3,ab=128,channels=2,samplerate=44100}:http{mux=ffmpeg{mux=flv},dst=".$app_ip.":".$app_port."/} :sout-keep";
  break;
 case "2":
  $vlc_data="vlc.exe rtp://".$app_ip.":".$source_port." :sout=#transcode{vcodec=h264,vb=800,width=960,height=540,acodec=mp3,ab=128,channels=2,samplerate=44100}:http{mux=ffmpeg{mux=flv},dst=".$app_ip.":".$app_port."/} :sout-keep";
  break;
 case "3" :
  $vlc_data="vlc.exe rtp://".$app_ip.":".$source_port." :sout=#transcode{vcodec=h264,vb=800,width=1280,height=720,acodec=mp3,ab=128,channels=2,samplerate=44100}:http{mux=ffmpeg{mux=flv},dst=".$app_ip.":".$app_port."/} :sout-keep";
  break;
 case "4" :
  $vlc_data="vlc.exe rtp://".$app_ip.":".$source_port." :sout=#transcode{vcodec=h264,vb=1500,width=1280,height=720,acodec=mp3,ab=128,channels=2,samplerate=44100}:http{mux=ffmpeg{mux=flv},dst=".$app_ip.":".$app_port."/} :sout-keep";
  break;
 default :
  $vlc_data="vlc.exe rtp://".$app_ip.":".$source_port." :sout=#transcode{vcodec=h264,vb=800,width=1280,height=720,acodec=mp3,ab=128,channels=2,samplerate=44100}:http{mux=ffmpeg{mux=flv},dst=".$app_ip.":".$app_port."/} :sout-keep";
  break;
}

printf("Tuner = ".$tuner_set.", Channel = 8vsb:".$_GET["channel"]."000000".", Program = ".$prog_get);

//exec($vlc_data);

function runBackground($Cmd, $Arg='')
{
    // vbs 내용 구성
    $VbsScript = <<<EOS
Set WshShell = CreateObject("WScript.shell")
WshShell.Run "___CMD___" ___ARG___, 0, false
Set WshShell = Nothing
EOS;
 
    $VbsScript = str_replace('___CMD___', $Cmd, $VbsScript);
 
    if ($Arg !== '') $Arg = ' & '.$Arg;
    $VbsScript = str_replace('___ARG___', $Arg, $VbsScript);
 
    // 임시경로에 임시 vbs 파일 생성
    $VbsFilePath = sys_get_temp_dir().'\\'.uniqid().'.vbs';
    file_put_contents($VbsFilePath, $VbsScript);
    // 실행
    exec($VbsFilePath);
    // 임시 vbs 파일 삭제
    unlink($VbsFilePath);   
}
 
// 실행시키고 PHP 스크립트는 종료됨
runBackground($vlc_data);
?>

<html>
<head>
</head>
<body>
<br>
<H4>
<input type="button" value=" Back "  onClick="history.go(-1)">
<!-- <input type="button" value=" Close " onClick="window.close()"> -->

</body>
</html>


이따구로 tvset.php만들고

주소창에 http://주소/tvset.php?tuner=1&channel=채널&prog=프로그램&res=해상도이렇게 해주면 끝...

index.html-x 이파일은  한강CMB채널 설정한 파일(2016.05.19일자)


TV볼때는 VLC같은 스트리밍 프로그램으로 주소 열기후 http://주소:8080 으로 하면 잘 나옴...


채널 종료 :

_TVDEL.bat TVDEL.php-x


이걸로 TV보기 삽질은 우선 끝...

Leave Comments