0

RAR アーカイブからビデオ コンテンツをストリーミングしようとしています。

最初の数秒間は問題なく動作しますが、問題はストリームが fseek をサポートしていないため、クライアントがさらにデータを要求したり、ビデオをシークしたりできないことです。

(http://www.php.net/manual/en/rarentry.getstream.php)

このアイデアを機能させることは可能ですか?

<?php
// Report all PHP errors
error_reporting(E_ALL);
ini_set('display_errors', '1');

// Open rar archive
$rar_file = rar_open('test.rar');
if ($rar_file === false)
    die("Failed to open Rar archive");

// Get video file in archive
$entry = rar_entry_get($rar_file, 'video.mkv');
if ($entry === false)
    die("Failed to find such entry");


header('Content-Type: application/octet-stream');
header('Content-Disposition: inline; filename="video.mkv"');

// Seek
$seek_start = 0;
$seek_end = -1;
$fs = $entry->getPackedSize();

if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE'])) {

    $seek_range = isset($HTTP_SERVER_VARS['HTTP_RANGE']) ? substr($HTTP_SERVER_VARS['HTTP_RANGE'], strlen('bytes=')) : substr($_SERVER['HTTP_RANGE'], strlen('bytes='));
    $range = explode('-', $seek_range);

    if ($range[0] > 0) {
        $seek_start = intval($range[0]);
    }

    $seek_end = ($range[1] > 0) ? intval($range[1]) : -1;


    header('HTTP/1.0 206 Partial Content');
    header('Status: 206 Partial Content');
    header('Accept-Ranges: bytes');
    header("Content-Range: bytes $seek_start-$seek_end/" . $fs);
}

if ($seek_end < $seek_start) {
    $seek_end = $fs - 1;
}
$cl = $seek_end - $seek_start + 1;

header('Content-Length: ' . $cl);
ob_flush();


// Get file stream
$stream = $entry->getStream();
rar_close($rar_file); //stream is independent from file

if ($stream === false)
    die("Failed to obtain stream.");

fseek($stream, $seek_start);
// Start stream
while (!feof($stream)) {
    set_time_limit(0);
    print(fread($stream, 8192));
    flush();
    ob_flush();
}

fclose($stream);
?>
4

2 に答える 2

1

後で、実装されていないため、PHP の rar アーカイブでは fseek がサポートされていないことがわかりました。これは Python で簡単に実行できるので、PHP で試してみました。

于 2012-02-03T16:33:27.040 に答える
0

.rar 形式をダンプして、もう一度やり直してください

Web で一般的に使用されているビデオ形式は、そのままで高度に圧縮されています。スペースはほとんど節約できませんが、複雑さが増します。これが問題かどうかはあなたのコードからはわかりませんが、実証済みのエンジニアリング デバッグ手法は、システムを最も基本的な形式に縮小し、それを機能させてから、複雑さを追加することです (.rar アーカイブ ファイルなど) 。 、疑わしい価値があります。)

于 2011-11-15T11:40:14.533 に答える