簡體   English   中英

從PHP流式傳輸時,html5 / mp4視頻無法在移動瀏覽器中播放

[英]html5 / mp4 video won't play in mobile browsers when streaming from PHP

我正在嘗試在具有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');

validate_session.php代碼內部僅包含以下內容:

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

我什至通過用不起作用的短代碼在屏幕上輸出會話來測試該會話,並且我可以看到$ _SESSION ['customer'] ['id']確實存在。

所以我不知道我在這里想念的是什么。

如果有人知道為什么這行不通,我將非常感謝您對此提供的意見!

謝謝!

除非會話的UID在URL中傳播,否則它將存儲在cookie中。 如果該頁面可以在桌面上正常工作,並且僅在不驗證會話時在移動設備上有效,則必須將問題鏈接到某處的cookie。 您的移動瀏覽器很可能不會保存Cookie,因此會在嘗試確認會話時將您踢出門。

或者,您可以在URL中傳遞會話ID: http : //php.net/manual/en/session.idpassing.php

如果您可以使其與查詢字符串中的會話ID一起使用,則說明它是cookie問題。

可以總結一下這個問題,移動播放的主要原因是每台設備的最大分辨率。

對於Windows Phone 8設備問題,我仍然一無所知。 似乎是斷斷續續的,我能夠在另一台服務器上播放它,然后通過更改一些代碼並稍后將其刪除來重新回到我的服務器上,但是現在它似乎可以工作了,我不知道為什么,所以我沒有碰它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM