経緯
Laravelで動画のストリーミング再生を実装する【Safariでも再生可能】
前回、こちらの記事でLaravelを使った動画のストリーミング再生のやり方を書きました。
デプロイ後も、リモート環境(S3とEC2の環境)で問題なく動作していましたが、
ある日、開発中のブランチをデプロイしたところ、
fseek(): stream does not support seeking
突然このエラーが出て、動画を読み込めなくなりました。
原因
結論から言うと、リモート(S3)のファイルに対してfseekしていたことが原因のようですが…
だがちょっとまってほしい、今までS3上のファイルにfseekして問題なく動作していたのはなんだったんだ?
そう思って現状動作している本番環境と見比べてみるも、該当部分のソースは同じ…。
結局原因は分からずでしたが、ある解決方法にたどり着きました。
解決
とりあえずS3からfseekできないなら一時ファイルにしてからfseekしようと思い、
冒頭で挙げた
Laravelで動画のストリーミング再生を実装する【Safariでも再生可能】
こちらの記事の App\Helpers\VideoStreamer
のコンストラクタ内のコードを以下のように修正すると動作することが確認できました!
public function __construct($disk, $path)
{
// $this->stream = $disk->readStream($path); <-廃止
// 追加 ここから
$this->stream = tmpfile();
fwrite($this->stream, $disk->get($path));
// ここまで
$this->mime = $disk->mimeType($path);
$this->filemtime = $disk->lastModified($path);
$this->size = $disk->size($path);
}