S3のファイルをfseekすると「fseek(): stream does not support seeking」とエラーが出た話

Laravel
スポンサーリンク

経緯

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);
}

 

タイトルとURLをコピーしました