从PHP流式传输时,html5 / mp4视频无法在移动浏览器中播放

时间:2013-04-10 20:28:28

标签: php mobile streaming mp4

我正在尝试使用PHP在移动浏览器上使用html5来传输mp4视频。

我正在使用以下课程:

http://labs.divx.com/node/17030

脚本工作正常,除了对mime_types数组的引用,我必须删除$才能使它工作。

无论如何,我的问题是这个。 当我使用file.mp4运行此脚本时,它在我的手机上正常运行。

但是,只要我输入代码来验证是否允许播放该文件等。 (如果客户已购买视频,如果他们已超过允许的观看次数等)

该文件根本不会加载。

它确实在桌面浏览器中加载。只有在移动浏览器中才能加载它。

以下是我用来播放文件的代码:

当我像这样运行时,它可以在桌面浏览器中运行,但不适用于移动设备:

<?php
apc_clear_cache();
session_start();
require(dirname(__FILE__) . "/../_includes/config.php");
require(dirname(__FILE__) . "/../_includes/validate_session.php");

$id = (int)$_GET['id'];

if (!$result = $mysqli->query('SELECT
orders_item_product_downloadable_videos.id,
orders_item_product_downloadable_videos.current_no_downloads,
DATE_ADD(IF(orders.id IS NOT NULL,orders.date_order,o.date_order),INTERVAL orders_item_product_downloadable_videos.no_days_expire DAY) AS date_expire,
product_downloadable_videos.embed_code,
orders_item_product_downloadable_videos.no_days_expire,
orders_item_product_downloadable_videos.no_downloads,
product_downloadable_videos.filename,
product_downloadable_videos.stream,
product_downloadable_videos.source

FROM 
orders_item_product_downloadable_videos 
LEFT JOIN
(orders_item_product CROSS JOIN orders_item CROSS JOIN orders)
ON
(orders_item_product_downloadable_videos.id_orders_item_product = orders_item_product.id AND orders_item_product.id_orders_item = orders_item.id AND orders_item.id_orders = orders.id)

LEFT JOIN
(orders_item_product AS oip CROSS JOIN orders_item_product AS oip_parent CROSS JOIN orders_item AS oi CROSS JOIN orders AS o)
ON
(orders_item_product_downloadable_videos.id_orders_item_product = oip.id AND oip.id_orders_item_product = oip_parent.id AND oip_parent.id_orders_item = oi.id AND oi.id_orders = o.id)

INNER JOIN 
product_downloadable_videos
ON
(orders_item_product_downloadable_videos.id_product_downloadable_videos = product_downloadable_videos.id)
WHERE
orders_item_product_downloadable_videos.id = "'.$id.'"
AND
(
(orders.id IS NOT NULL AND orders.status IN (1,7) AND orders.id_customer = "'.(int)$_SESSION['customer']['id'].'")
OR
(o.id IS NOT NULL AND o.status IN (1,7) AND o.id_customer = "'.(int)$_SESSION['customer']['id'].'")
)       
LIMIT 1')) throw new Exception('An error occured while trying to get video info.'."\r\n\r\n".$mysqli->mysqli->error);

if (!$result->num_rows) {
//throw new Exception(language('account/order', 'ERROR_DOWNLOAD_EXPIRED'));
exit;   
}       

$row = $result->fetch_assoc();  
$result->free();

if ($row['no_downloads'] > 0 && $row['current_no_downloads'] >= $row['no_downloads']) {
//throw new Exception(language('account/order', 'ERROR_NO_DOWNLOADS_REACHED'));
exit;   
}       

if ($row['no_days_expire'] > 0 && strtotime($row['date_expire']) <= time()) {
//throw new Exception(language('account/order', 'ERROR_DOWNLOAD_EXPIRED'));
exit;               
}

$file = dirname(__FILE__).'/../admin/protected/streaming_videos/'.$row['source'];

require(dirname(__FILE__).'/../_includes/classes/stream.php');

$st = new VSTREAM();
$st->stream(dirname(__FILE__).'/../397d729225599bcda978ac4fd4aaeba2.mp4');

当我评论和运行它时,它适用于移动浏览器,但为什么?

<?php
apc_clear_cache();
session_start();
require(dirname(__FILE__) . "/../_includes/config.php");

require(dirname(__FILE__).'/../_includes/classes/stream.php');

$st = new VSTREAM();
$st->stream(dirname(__FILE__).'/../397d729225599bcda978ac4fd4aaeba2.mp4');

如果我添加validation_session.php代码,则无效。

<?php
apc_clear_cache();
session_start();
require(dirname(__FILE__) . "/../_includes/config.php");
require(dirname(__FILE__) . "/../_includes/validate_session.php");

require(dirname(__FILE__).'/../_includes/classes/stream.php');

$st = new VSTREAM();
$st->stream(dirname(__FILE__).'/../397d729225599bcda978ac4fd4aaeba2.mp4');

validation_session.php代码只在里面有这个:

<?php
if(!$_SESSION['customer']['id']){
    header("Location: /account/login");
    exit;
}
?>

我甚至通过使用非工作短代码在屏幕上输出会话来测试会话,我可以看到$ _SESSION ['customer'] ['id']确实存在。

所以我不知道我在这里缺少什么。

如果有人知道为什么这不起作用,我将非常感谢您对此的意见!

谢谢!

2 个答案:

答案 0 :(得分:0)

除非会话的UID在URL中传播,否则它将存储在cookie中。如果页面在桌面上工作没有问题,并且只有在您未验证会话时才能在移动设备上运行,则必须将问题链接到某处的cookie。最有可能的是,您的移动浏览器没有保存cookie,因此在尝试确认会话时会将您踢出去。

或者,您可以在URL中传递会话ID: http://php.net/manual/en/session.idpassing.php

如果您可以使用查询字符串中的会话ID,那么您就知道这是一个cookie问题。

答案 1 :(得分:0)

好的,总结这个问题,移动播放的主要原因是每台设备的最大分辨率。

对于Windows Phone 8设备问题,我仍然没有任何线索。 它似乎是断断续续的,我能够通过改变一些代码并在以后删除它来从另一台服务器上播放它,但现在它似乎工作,我不知道为什么所以我没有触及它。