使用PHP从服务器流式传输视频

时间:2017-04-24 21:46:47

标签: php streaming video-streaming

我需要将Web服务器上的选定视频文件流式传输到客户端。我正在使用PHP脚本按要求流式传输这些文件,但我遇到了一个问题,如果我在本地网上,它工作正常,但如果我是远程的,它会口吃。例如。它似乎加载流,停止,加载更多,停止等,直到有足够的媒体可用。我是新手,所以我需要一些建议来解决这个问题。带宽应该不是问题,所以我不确定发生了什么。我已经尝试了几个php流媒体,但所有行为都差不多。我正在使用videojs在客户端中显示它。

<?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();

&GT;

我目前正在尝试的VideoStream.php类位于: VideoStream

同样奇怪的是,播放器底部的条形似乎表明视频已缓冲,但播放器仍然口吃。不确定这意味着什么。

1 个答案:

答案 0 :(得分:0)

您描述的行为是通过低或间歇带宽连接进行视频传输的典型行为。

解决此问题的方法通常非常复杂,但在服务器端内置于现成的流媒体服务器中,例如:https://gstreamer.freedesktop.org

您也可以使用像云前端或Akami等CDN受益 - 这些基本上是为了在网络边缘创建内容副本,以缩短用户的响应时间。