use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\File;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class ProcessM3U8 implements ShouldQueue
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $input; // 定义原始视频文件路径;
public $output; // 定义转码视频文件路径;
public $timeout = 3600; // 定义操作延迟时间,单位:秒;
public $tries = 5; // 定义队列重试次数;
public $memory = 1024; // 定义队列所占最大内存限制;
public $threads = 2; // 定义队列所占最大线程数;
public $section = 60; // 定义视频切片大小,单位:秒;
public $progress = 0; // 当前转码进度;
* Create a new job instance.
* ProcessM3U8 constructor.
* @param string $input
* @param string $output
public function __construct(string $input,string $output)
$this->input = $input;
$this->output = $output;
* Execute the job.
* @note The Handle need composer package as php-ffmpeg by command "composer require php-ffmpeg/php-ffmpeg"
* @afterChange "php artisan queue:restart & php artisan queue:work --queue=video"
public function handle()
Log::channel('video')->info('执行转换:'.public_path().$this->output);
ini_set('memory_limit',$this->memory.'M');
$ffmpeg = FFMpeg\FFMpeg::create([
'ffmpeg.binaries' => exec('which ffmpeg'),
'ffprobe.binaries' => exec('which ffprobe'),
'timeout' => $this->timeout,
'ffmpeg.threads' => $this->threads,
$video = $ffmpeg->open(public_path().$this->input);
$format = new FFMpeg\Format\Video\X264('aac', 'libx264');
$format
->setAdditionalParameters(['-hls_time',$this->section, '-hls_list_size',0,'-strict','-2', '-f','hls'])
->setKiloBitrate(1000)
->setAudioChannels(2)
->setAudioKiloBitrate(256)
->setPasses(2);
$format->on('progress', function ($video, $format, $percentage) {
if ($percentage > $this->progress){
Log::channel('video')->info('转换进度:'.$percentage.'%');
$this->progress = $percentage;
$directory = pathinfo(public_path().$this->output)['dirname'];
File::isDirectory($directory) or File::makeDirectory($directory);
try {
$video->save($format, public_path().$this->output);
} catch (\Exception $e) {
Log::channel('video')->error('错误:'.$e->getMessage());
} finally {
$this->result = $this->output;
Log::channel('video')->info('转换成功:'.public_path().$this->output);
转码参数由setAdditionalParameters 方法写入
之前采用exec 可以直接执行 但是无法看到任务进度,所以引入第三方扩展
$this->output 为定义的输出文件名,这里指定的是m3u8格式
先安装php拓展https://github.com/PHP-FFMpeg/PHP-FFMpeg/<?phpnamespace App\Jobs;use FFMpeg;use Illuminate\Bus\Queueable;use Illuminate\Support\Facades\Log;use Illuminate\Support\Facades\File;...
FFmpeg
是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了 libavcodec ─这是一个用于多个项目中音频和视频的解码器库,以及 libavformat—— 一个音频与视频格式转换库。
这个项目最初是由 Fabrice Bellard 发起的,而现在是由 Michael Niedermayer 在进行维护。许多
FFmpeg
的开发者同时也是 MPlayer 项目的成员,
FFmpeg
在 MPlayer 项目中是被设计为服务器版本进行开发。
快速安装的脚本
wget https://raw.githubusercontent.com/q3aql/
ffmpeg
-install/master/
ffmpeg
-install
chmod a+x
ffmpeg
-install
./
ffmpeg
-install --install release
安装
laravel
-
ffmpeg
执行composer命令
composer require pbmedia/
laravel
-
ffmpeg
修改config/app.php添加配置
关于HLS和m3u8格式的介绍有很多,这里单纯只看
ffmpeg
转码
生成的m3u8的文件。
Laravel
中如何使用
ffmpeg
转码
。
下面是
ffmpeg
转码
生成的单码率和多码率的文件列表
一共生成了三种类型的文件
name.m3u8 Master Playlist主列表,单码率和多码率主要区别就要这个文件,多码率对比单码率多了两个不同码率的Media Playlist
video_single_bitrate.m3u8 单码率
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=10
FFmpeg
是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
多媒体视频处理工具
FFmpeg
有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
.exe下载
Download
FFmpeg
for Windows
地址:https://
ffmpeg
.zeranoe.com/builds/
下载好后放...
$form = new Form(new Video());
$form->text('video_title', __('Video title'));
// uniqueName(随机生成一个文件名) move(放入的文件夹)
$form->file('video_url', __('Video url'))
php执行
ffmpeg
命令对mp4文件转换并生成m3u8视频流文件的方法使用m3u8视频流的好处先将视频转换成视频ts文件将ts视频文件分割成视频流文件ts,并生成索引文件m3u8
使用m3u8视频流的好处
生成m3u8视频流,如果没有做视频流文件,播放视频的时候,一个大视频直接加载,会增加服务器巨大压力,并且视频太大加载慢,显示视频也慢,都不利于观看。那么视频流的好处是,将大视频分成一小段一小段的ts分片,播放时选择专门的播放器,播放m3u8索引文件来读取分片。而且当播放器根据m3u8索引文件播放视频时,
由于楼主公司生产的设备性能不足,在进行播放高质量的MP4视频或者其他格式的视频时,会导致设备黑屏。所以必须由后端来解决视频
转码
的问题。通过搜索,可以通过
FFmpeg
来实现视频压缩的功能。当实现视频压缩功能的时候,又出现了一个问题,那就是每次上传视频时,单个视频处理很快,多个视频同时上传时就会出现同时启动多个
FFmpeg
进程,导致cpu性能被沾满如图所示
可以看出 多个进程同时启动会导致服务器性能急剧下降,为了解决这个问题,可以通过Redis来实现一个队列功能。当我们每次上传一个文件时把文件信息存储到一个列
我叫什么呢?: