laravel - 从 laravel 存储播放 m3u8 视频
问题描述
我的问题与如何从 laravel 存储中播放 m3u8 视频相同,但这个问题没有得到答案。
如果我从公用文件夹播放视频,它会毫无问题地播放。
但如果我想从存储中播放它,这是行不通的。
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
磁盘配置错误。尝试以这种方式存储您的视频:
$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 视频,请尝试使用此类第三方插件播放这些视频格式。
推荐阅读
- angular - 错误类型错误:无法读取未定义的属性“登录”
- session - Chrome 和 MS Edge 不为同一域共享相同的会话 cookie,用于单独的浏览器实例
- amazon-web-services - 弹性负载均衡器规则:引导来自特定应用程序的所有流量
- c++ - 将 copts 传播到 Bazel 中的所有依赖项
- javascript - 使用带有 lodash debounce 功能的 Vue.js 3
- arrays - 来自字符集分段错误的随机词
- ios - 在 Swift 5 中获取 Vimeo 视频时长
- business-intelligence - (Quicksight)是否可以有一个考虑日期字段粒度的计算字段
- material-table - 按下材料表后如何隐藏按钮
- reactjs - React Router url 更新但组件没有