【问题标题】:play m3u8 video from laravel storage从 laravel 存储播放 m3u8 视频
【发布时间】:2020-05-05 07:32:46
【问题描述】:

我的问题和how to play m3u8 videos from laravel storage一样,但是这个问题没有得到答案。

如果我从公用文件夹播放视频,它会毫无问题地播放。

但如果我想从存储中播放它,这是行不通的。

    public function watch(Request $request, Episode $episode)
{

    $video = Storage::disk('videos')->get($episode->video);

    return new Response($video, 200, ['Content-Type' => 'application/x-mpegURL', 'isHls' => true]);
}

这是我的磁盘在config/filesystems.php中的定义

  'videos' => [
        'driver' => 'local',
        'root' => storage_path('app/videos'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

这是我的转换代码(工作)

     */
public function handle()
{
    $path = $this->episode->id . '.m3u8';
    $lowBitrate  = (new X264 ('aac'))->setKiloBitrate(500)->setVideoCodec('libx264');
    $midBitrate  = (new X264 ('aac'))->setKiloBitrate(1000)->setVideoCodec('libx264');
    $highBitrate = (new X264 ('aac'))->setKiloBitrate(3000)->setVideoCodec('libx264');

    FFMpeg::fromDisk('tmp')->open($this->episode->video)
        ->exportForHLS()
        ->dontSortFormats()
        ->setSegmentLength(10)
        ->toDisk('local')
        ->addFormat($lowBitrate, function($media) {
            $media->addFilter(function ($filters) {
                $filters->resize(new \FFMpeg\Coordinate\Dimension(640, 480));
            });
        })
        ->addFormat($midBitrate, function($media) {
            $media->addFilter(function ($filters) {
                $filters->resize(new \FFMpeg\Coordinate\Dimension(1280, 960));
            });
        })
        ->addFormat($highBitrate, function($media) {
            $media->addFilter(function ($filters) {
                $filters->resize(new \FFMpeg\Coordinate\Dimension(1280, 960));
            });
        })
        ->save($path);

    $this->episode->update([
        'video' => $path,
    ]);

    FFMpeg::cleanupTemporaryFiles();

}

【问题讨论】:

  • 您使用videos 作为磁盘,您是否在config/filesystems.php 文件上定义了videos 磁盘?
  • 是的,当然是定义的
  • 能发一下吗?
  • 我已经将它添加到问题中
  • 您如何存储视频?你也可以发布它的代码吗?

标签: laravel ffmpeg streaming http-live-streaming m3u8


【解决方案1】:

您的videos 磁盘配置错误。尝试以这种方式存储您的视频:

$episode->video = $request->file('video')->store('videos', 'local');

然后在routes/web.php上添加一条新路由:

Route::get('/episodes/{episode}/watch', 'EpisodeController@watch')->name('episodes.whatch');

在你的控制器上试试这个:

use Illuminate\Support\Facades\Storage

public function watch(Request $request, Episode $episode)
{
    return Storage::disk('local')->response(
        $episode->video,
        "optional_name_or_null",
        [
            'Content-Type' => 'application/x-mpegURL',
            'isHls' => true
        ]
    );

    //or alternatively use this one:
    /*
    return response()->file(
        Storage::disk('local')->path($episode->video),
        [
            'Content-Type' => 'application/x-mpegURL',
            'isHls' => true
        ]
    );
    */
}

现在您可以通过以下方式访问您的视频:'http://your-domain.com/episodes/1/watch'

注意:播放 HLS/DASH 视频在大多数 浏览器,尝试使用第三方插件like this one播放 这些视频格式。

【讨论】:

  • 感谢您的回答,试试您告诉我的,将文件存储在本地磁盘 i.imgur.com/MtoRQOP.png 并返回 Storage :: disk ('local') -> response ($ episode-> video );我从文件 i.imgur.com/KVAQ0ZT.png 中获取文本,返回响应 () -> 文件 ( Storage :: disk ('local') -> path ($ episode-> video), [ 'Content-Type' => 'application / x-mpegURL', 'isHls' => true ] );我得到与以前相同的结果,它不播放。我会将我的转换代码添加到问题中。
  • @Jennsen 如果您在第一个上设置标题怎么办?我已经更新了我的答案,请再试一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多