PHPでiPhoneの動画再生に対応したレスポンスを返す

iPhoneで動画を再生する際には以下の様な挙動になります。

  1. Safariから動画用URLにアクセス、Content-Type:video/quicktimeで200のステータスコードを返す。
  2. Content-Typeからこれは動画ファイルだと判断され、動画プレイヤーを起動、AppleCoreMediaから動画用URLにRange:0-1のヘッダー付きでアクセス、Content-Range: bytesのヘッダー付きで206のステータスコードを返す。
  3. 206ステータスから、動画ファイル再生可能と判断し、AppleCoreMediaから動画用URLにRange:0-XXXのヘッダー付きでアクセス206のステータスコードを返す。
  4. これを動画ファイルの終端まで繰り返す。
<?php

  $row = mysql_fetch_assoc($result);
  $zv_filesize = strlen($row[$data_column]);
  header('Content-type: ' . $row["content_type"]);
  header('Content-Disposition: attachment; filename=' . urlencode ($row["name"]));
  $httpRange = $_SERVER['HTTP_RANGE'];
  if (isset($httpRange)) {
    list($toss, $range) = explode('=', $httpRange);
    list($range_start, $range_end) = explode('-', $range);
    $length = $range_end - $range_start +1;
    header('HTTP/1.1 206 Partial Content');
    header('Content-Length: ' . $length);
    header('Content-Range: bytes ' . $range . '/' . $zv_filesize);
    echo mb_strcut($row[$data_column], $range_start, $length);
  } else {
    header('Content-Length: ' . $zv_filesize);
    echo $row[$data_column];
  }