2014-06-16 1 views
0

현재 video.js 및 php를 사용하여 비디오 파일을 스트리밍하려고합니다. HTML을 사용하여 직접 파일을로드 할 수 있지만 PHP를 통해 소스 태그를 통해 비디오의 이름을 전달하려고하면 서버 또는 네트워크가 실패했거나 비디오가로드되지 않아 비디오를로드 할 수 없다는 오류가 발생합니다. 형식이 지원되지 않습니다.php 및 video.js를 사용하여 비디오 파일 스트리밍

<head> 
<link href="css/videojs/video-js.css" rel="stylesheet"> 
<script src="scripts/videojs/video.js"></script> 
<script> 
videojs.options.flash.swf = "swf/videojs/video-js.swf"; 
</script> 
</head> 



$videofilename = $name; // name of the file Eg video.mp4 
    echo '<video id="player" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="640" height="360" poster="images/video_img.png"> 

<source type="video/mp4" src="uploads/video.php?'.$videofilename.'" > 

<p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p> 
    </video>'; 



    echo'<script> 
     videojs("player", {}, function(){ 
    });  
    </script>'; 

video.php 다음 코드

<script> 

var query = location.href.split('?'); 

document.cookie = 'anchor=' + query[1]; 
</script> 
<?php if (!$_COOKIE['anchor']){ 

echo"<script> window.location.reload() </script>"; 
} 
else 
{ 

$streamname = $_COOKIE['anchor']; 
$stream_size = filesize($streamname); 
header('Content-Description: File Transfer'); 
header('Content-type: video/mp4'); 
header("Content-length: " . filesize($streamname)); 
header("Expires: 0"); 
header("Content-Transfer-Encoding: binary"); 
header("Accept-Ranges: 0-$stream_size"); 
$file = fopen($streamname, 'r'); 
echo stream_get_contents($file);  
fclose($file); 
} 



?> 
+0

내 브라우저에 저장된 쿠키를 받고 있지 않다

는 그래서 같은 URL에 매개 변수의 이름을 지정 제안 – user3734861

답변

0

문제가 미디어 형식이 일치 인 것 같습니다이 포함되어 다음과 같이

내 코드입니다. 당신은 video.php은 MP4 데이터를 반환합니다 브라우저 말하고있다 :

<source type="video/mp4" src="uploads/video.php?'.$videofilename.'" > 

그러나이 있지만 video.php 스크립트는 첫 번째 줄의 스크립트 태그부터 시작하여 HTML을 보냅니다. 스크립트가 거기서 헤더에 도착했다면 PHP 로그에 오류가 발생하여 데이터 전송을 시작한 후에 헤더를 보낼 수 없습니다.

자바 스크립트를 사용하여 URL의 일부분을 얻으려는 것으로 보입니다.이 URL은 클라이언트 브라우저에 넣기 전까지 평가되지 않으므로 서버에서 실행중인 PHP 코드를 사용할 수 없습니다 . video.php 파일에서

:

코드의 첫 번째 비트는 HTML이 아닌 MP4이며, 자바 스크립트는 PHP에 의해 평가되지

<script> 

var query = location.href.split('?'); 

document.cookie = 'anchor=' + query[1]; 
</script> 

어떤 쿼리 문자열에 관계없이 다시 전송됩니다 , 그냥 브라우저로 보내지 만 video.php가 비디오 요소의 소스로로드되기 때문에 실행되지 않습니다. 다음에 오는 PHP 블록은 PHP 인터프리터 서버 측에 의해 평가되지만 자바 스크립트가 아직 실행되지 않았기 때문에 쿠키가 설정되지 않습니다.

<source type="video/mp4" src="uploads/video.php?filename='.$videofilename.'" > 

및 video.php에서

는, 다음과 같이 사용 $_GET을 제거 :

<?php 
if (isset($_GET['filename']) && $_GET['filename'] != '') { 
    $streamname = $_GET['filename']; 
    $stream_size = filesize($streamname); 
    header('Content-Description: File Transfer'); 
    header('Content-type: video/mp4'); 
    header("Content-length: " . filesize($streamname)); 
    header("Expires: 0"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Accept-Ranges: 0-$stream_size"); 
    $file = fopen($streamname, 'r'); 
    echo stream_get_contents($file);  
    fclose($file); 
} 
?> 
+0

@ joe, 답변 주셔서 감사합니다, 나는 이미 해냈어, 유능한 경우에는 사용자가 PHP를 사용하여 비디오의 다운로드를 방지하는 방법으로 모든 정보를 제공 할 수 있습니다. – user3734861

+0

비디오 태그에 oncontextmenu = "return false"를 사용했지만 쉽게 비활성화 할 수 있습니다. – user3734861

+0

대부분의 브라우저는 특정 미디어 유형을 재생하는 데 사용할 프로그램을 지정하므로 다운로드는 암호화, 사용자 지정 형식 또는 DRM 사용 가능 플레이어가 필요하지 않으면 효과적으로 방지 할 수 없습니다. – Joe

관련 문제