1

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'] が存在することがわかりました。

だから私はここで何が欠けているのか分かりません。

これがうまくいかない理由を誰かが知っている場合は、これに関するご意見をいただければ幸いです。

ありがとう!

4

2 に答える 2

0

セッションの UID が URL で伝搬されない限り、Cookie に保存されます。ページがデスクトップでは問題なく動作し、セッションを検証していないときにモバイル デバイスでのみ動作する場合、問題はどこかの Cookie にリンクされている必要があります。ほとんどの場合、モバイル ブラウザは Cookie を保存していないため、セッションを確認しようとしたときに追い出されています。

または、次の URL でセッション ID を渡すこともできます: http://php.net/manual/en/session.idpassing.php

クエリ文字列のセッション ID を使用して動作させることができれば、それは Cookie の問題であることがわかります。

于 2013-04-10T21:15:06.717 に答える
0

この問題の結論として、モバイル再生の主な理由は、デバイスごとの最大解像度でした。

Windows Phone 8 デバイスの問題については、まだ手がかりがありません。断続的なようです。別のサーバーで再生してから、コードを変更して後で削除することで再生できましたが、今では機能しているようで、理由がわからないので触れていません。

于 2013-04-12T17:14:57.273 に答える