2012-03-25 17 views
10

Actualización: Esto es ahora un tutorial sobre cómo dar cierto nivel de seguridad para el streaming de videos si:
1) que está utilizando Flowplayer con Apache
2) no desea que los usuarios para poder descargar el video (solo transmisión)
3) no desea que los usuarios puedan poner la URL del video en el navegador (videos de acceso limitado)
4) solo desea que los usuarios puedan para transmitir el video si tienen las credenciales adecuadasFlowplayer Transmisión segura con Apache

Debe tener conocimiento previo de PHP y .htaccess archivos.

Post original:
Mi cliente quiere que sus vídeos ocultos para que no se pueden transmitir hasta que se compran en su dominio (que no quiere que los usuarios puedan descargar el video tampoco). Estoy intentando hacer esto con Flow Stream seguro de Flowplayer y creo que ya casi estoy allí. ¡Estoy allí ahora!). Después de buscar en todas partes, encontré this post.

He restringido en caliente vinculación de otros sitios a través de .htaccess Ahora estoy tratando de restringir el acceso de alguien que acaba de copiar la URL y pegarla en la barra de direcciones (es decir http://www.mydomain.com/videos/testVideo.mov)

que he usado PHP/AJAX para generar este HTML (la mayoría de los ejemplos usan el plugin JS Flowplayer, estoy usando la etiqueta <object> para incrustar el reproductor, sin JS involucrado. Si usa el plugin JS, use eso en lugar de la versión incrustada, archivo .htaccess y el archivo video.php serán los mismos.)

$videofilename = 'testVideo.mov';  
$hash = md5('1234'); 
$timestamp = time(); 
$videoPath = $hash.'/'.$timestamp.'/'.$videofilename; 
echo ' 
<object width="667" height="375" type="application/x-shockwave-flash" data="http://releases.flowplayer.org/swf/flowplayer-3.2.8.swf"> 
    <param name="wmode" value="transparent"/> 
    <param name="movie" value="../swf/flowplayer.securestreaming-3.2.8.swf" /> 
    <param name="allowfullscreen" value="true" /> 
    <param name="timestamp" value="'.$timestamp.'" /> 
    <param name="token" value="'.$hash.'" />  
    <param name="streamName" value="'.$videofilename.'" />  

    <param name="flashvars" value=\'config={ 
     "playlist":[ 
      {"url": "'.$videoPath.'", "baseUrl": "http://www.mydomain.com/videos", "autoPlay":false,"autoBuffering":true,"bufferLength":5} 
      ] 

     }\' /> 
</object>'; 

Ahora en el directorio videos puse este archivo .htaccess:

RewriteEngine on 
RewriteRule ^(.*)/(.*)/(.*)$ http://www.mydomain.com/vidoeos/video.php?h=$1&t=$2&v=$3 
RewriteRule ^$ - [F] 
RewriteRule ^[^/]+\.(mov|mp4)$ - [F] 

Actualización: La finalidad del fichero php es 1) obtener el hash de los datos, fecha y hora, y el nombre de archivo de vídeo (test.mov o lo que sea) 2) Asegúrate de que todo se compruebe (deliberadamente he omitido las comprobaciones de seguridad en este ejemplo para la longitud) y 3) Dale a Flowplayer la transmisión de tu video. Asegúrese de que $originaltimestamp y $hash son buenos antes de dar acceso. También puede verificar las credenciales de la sesión, obtener la ubicación del archivo 'real' desde una base de datos o realizar cualquier clase de verificación de seguridad php que desee antes de permitir el acceso del usuario.

También recuerde que debe cambiar el campo Content-type: por lo que se correlaciona con la extensión correcta (es decir video/mp4 si el vídeo es un * .mp4)

Y videos/video.php se parece a esto:

<?php 
session_start(); 

$hash = $_GET['h']; 
$streamname = $_GET['v']; 
$originaltimestamp = $_GET['t']; 

header('Content-Description: File Transfer'); 
header('Content-type: video/quicktime'); 
header("Content-length: " . filesize($streamname)); 
header("Expires: 0"); 
header("Content-Transfer-Encoding: binary"); 

$file = fopen($streamname, 'r'); 
echo stream_get_contents($file);  
fclose($file); 
?> 

tres archivos en total, el HTML con el reproductor, el archivo .htaccess y, por último, el archivo video.php. Mi problema original era el $streamname estaba mal. Recuerde que el $streamname debe ser la ubicación del archivo después de (o debajo) de la BaseUrl. Espero que esto ayude a alguien como yo!

¿Alguien ve problemas de seguridad al hacerlo de esta manera?

+0

** Actualización: No utilizar flowplayer-3.2.8.swf con este código ** Use flowplayer-3.2.7.. swf con flowplayer.controls-3.2.5.swf. Si usas flowplayer-3.2.8.swf, solo funcionará en Chrome y no en FF, Safari o IE (9) – phpKid

+0

** Actualización: puedes usar flowplayer-3.2.8 ** solo asegúrate de tener la última versión versión de Flash! (mi mal) – phpKid

+0

¿Es posible esta misma técnica con el reproductor HTML5 de Flow Player? – Wikki

Respuesta

3

Okay ¡Lo solucioné! En esta línea:

$streamname = "http://www.mydomain.com/videos/".$streamname; (No es hasta más allí)

lo tenía todo mal. Todo lo que tuve que hacer fue eliminar esta línea y funcionó. Comenzará con su baseUrl. Por lo tanto, ya estaba en la carpeta "videos", por lo que $ streamname debería ser igual a la ubicación del archivo después de la baseUrl.

En una nota lateral, me llevó alrededor de una semana resolver que estaba buscando en todas partes en internet para juntar las piezas. Me creado esto en un tutorial para que otros usuarios no tendrán un dolor de cabeza (con suerte!)

2

me llevó 2 días para descubrir esto ....

Si el directorio donde se almacenan los videos es CHMOD a 777 entonces va a estancar la corriente ...

fui alrededor de las casas tratando de averiguar por qué en el nombre de demonios esto no sería transmitir mi vídeo ...

i tenido un directorio ya existente para los archivos de vídeo tal como lo usa otro script popular de php de imágenes que había establecido ese directorio en CHMOD 777 durante su tiempo ... simplemente configurándolo en CHMOD 755 permitió la flv o mp4 para transmitir a mi jugador incrustado en mi página php ... ¡qué alivio!

Así que gracias por el alivio de la cefalea ... Esto ayudó tanto, aplausos

+0

Gracias por la información adicional, moveré mi sitio a otro servidor pronto, así que me alegro de que lo haya mencionado en caso de que obtenga los mismos errores. – phpKid

Cuestiones relacionadas