我需要将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
同样奇怪的是,播放器底部的条形似乎表明视频已缓冲,但播放器仍然口吃。不确定这意味着什么。
答案 0 :(得分:0)
您描述的行为是通过低或间歇带宽连接进行视频传输的典型行为。
解决此问题的方法通常非常复杂,但在服务器端内置于现成的流媒体服务器中,例如:https://gstreamer.freedesktop.org
您也可以使用像云前端或Akami等CDN受益 - 这些基本上是为了在网络边缘创建内容副本,以缩短用户的响应时间。