2017-04-24 5 views
0

웹 서버에서 선택한 비디오 파일을 클라이언트로 스트리밍해야합니다. 내가 요청한대로 이러한 파일을 스트리밍 PHP 스크립트를 사용하고 있지만 로컬 네트워크에있는 경우 문제가 실행되고, 그것은 잘 작동하지만 원격 경우 그것은 stutters. 예. 재생할 미디어가 충분할 때까지 스트림로드, 정지, 더로드, 중지 등이 나타납니다. 나는이 물건을 처음 사용하기 때문에이 문제를 극복하는 방법에 대한 조언이 필요하다. 대역폭이 문제가 아니어야하므로 무슨 일이 일어나는지 잘 모르겠습니다. 몇 가지 PHP 깃발을 시도했지만 모두 거의 동일하게 작동합니다. 나는 videojs를 사용하여 클라이언트 내에 표시합니다.서버에서 PHP로 비디오 스트리밍

<?php 
use vendor\videojswidget\VideoJsWidget; 
$url = Yii::$app->urlManager->createUrl('/site/putvideo'); 
$currentVideo = ''; 
$script1 = "function playAnotherVideo(){ 
    var source = document.getElementById('fileSelector'); 
    var path = source.value; 
    $.ajax({ 
     type: 'post', 
     data: {file: path}, 
     url: '" .$url. "', 
     success: function(result){ 
      var video = document.getElementById('videoPlayer'); 
      video.src = result; 
      alert(result); 
      video.load(); 
     }, 
     error: function(){ 
      alert('error'); 
     } 
    }); 
}"; 

$this->registerJs($script1, yii\web\View::POS_END, 'my-options'); 

/* @var $this yii\web\View */ 

$this->title = 'View Vault Lecture Capture System'; 
?> 
<div class="site-index" style="background-color: black; color: yellow;"> 

    <div style="background-color: black;"> 
     </br></br></br></br>  
     <h1 align="center">Welcome to the TEKVOX Lecture Capture System</h1> 
     </br></br></br></br> 
    </div> 
    <div class="body-content"> 
     <div style="width: 100%; overflow: hidden;"> 
     <div style="width: 50px; float: left;"> 
     </br></br> 
     <label for="fileselector" style="margin-left: 4em; width: 10em; 
      font-weight: bold; color: #FFFF00;">Video_Files</label> 
     <select id="fileSelector" onchange="playAnotherVideo()" size="10em" 
     style="margin-left: 0em; color: #FFFF00; background-color: #000000; 
     border-color: #FFFFFF"> 
<?php 
     if ($handle = opendir('c:/users/admin/videos/')) { 

      while (false !== ($entry = readdir($handle))) { 

       if ($entry != "." && $entry != ".." && 
        strtolower(substr($entry, strrpos($entry, '.') + 1)) == 
         'mp4'){  
        echo "<option value='$entry'>" .$entry. "</option>"; 
       } 
      } 

      closedir($handle); 
     } 
?> 
</select> 
</div> 
<span id="divplayer" style="margin-left: 20em;"> 
<?php 

echo VideoJsWidget::widget([ 
    'options' => [ 
     'class' => '', 
     'id' => 'videoPlayer', 
     'poster' => "GreenX.png", 
     'controls' => true, 
     'preload' => 'none', 
     'width' => '800', 
     'height' => '450', 
    ], 
    'tags' => [ 
     'source' => [ 
      ['src' => '', 'type' => 'video/mp4'], 
     ], 
     'track' => [ 
      ['kind' => 'captions', 'src' => 
'http://vjs.zencdn.net/vtt/captions.vtt', 'srclang' => 'en', 'label' => 
'English'] 
     ] 
    ] 
]); 

?> 
     </span> 
    </div> 
</div> 
</br> 

getVideo.php 코드 :

<?php 
include_once "videoStream.php"; 
$filename = $_GET['filename']; 
if($filename == '') 
    return; 
$file = "c:\\users\\admin\\videos\\" .$filename; 

$stream = new VideoStream($file); 
$stream->start(); 

>

내가 현재 시도 오전 VideoStream.php 클래스입니다에서 : VideoStream

무엇도 이상한 것은 플레이어 바닥에있는 막대는 비디오가 버퍼되어 있음을 나타내는 것으로 보이지만 플레이어는 여전히 더듬 거리는 소리입니다. 그게 무슨 뜻인지 모르겠다.

+0

샘플 코드를 포함하여 지금까지 시도한 것을 공유하면 도움이됩니다. – iangetz

+0

http://nginx.org/en/docs/http/ngx_http_mp4_module.html 및 https://github.com/arut/nginx-rtmp-module을 살펴 보셨습니까? PHP는 여러분이 원하는 것에 적합하지 않습니다. 그것은 많은 오버 헤드를 추가합니다. – hdezela

답변

0

설명하는 동작은 낮거나 간헐적 인 대역폭 연결을 통한 일반적인 비디오 전송입니다.

접근 방법은이 예를 들어, 일반적으로 매우 정교하지만 서버 측에서 쉽게 사용할 수 스트리밍 서버에 내장 해결하려면 https://gstreamer.freedesktop.org 또한 클라우드 전면 또는 Akami 등 같은 CDN을 사용하여 혜택을 누릴 수 있습니다

-이 기본적으로 있습니다 사용자의 응답 시간을 향상시키기 위해 네트워크 가장자리에있는 콘텐츠 사본을 만들도록 설계되었습니다.