使用php对接阿里云mps对oss上视频进行转码m3u8 PHP
目前许多短视频平台都采用把用户上传视频统一转码为m3u8+ts文件格式
主要优势:
适应性流媒体传输:M3U8可以根据用户的网络速度自动调整视频质量,确保流畅播放。它通过提供不同质量级别的媒体文件链接,使播放器能够根据当前网络条件选择最合适的质量级别进行播放。
分段传输:将长视频分割成小片段,便于通过HTTP协议快速传输。这种方式使得视频可以边下载边播放,减少了等待时间。
跨平台兼容性:M3U8格式被广泛支持,可以在多种设备和浏览器上播放,包括移动设备、桌面计算机以及智能电视等。
直播和点播:M3U8既可以用于直播流媒体,也可以用于点播服务,使其成为在线视频平台的理想选择。
本次使用php对接阿里云提供的mps服务,对视频进行转码
安装以下SDK
composer install alibabacloud/sdk
composer install alibabacloud/mts-20140618
下面代码为提交转码任务
<?php
namespace app;
use AlibabaCloud\SDK\Mts\V20140618\Models\SubmitJobsRequest;
use AlibabaCloud\SDK\Mts\V20140618\Mts;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\Tea\Tea;
use AlibabaCloud\Tea\Utils\Utils;
class LeCommon
{
const accessKeyId = 'LT*******mHs';
const accessKeySecret = 'rki********P3J';
const regionId = 'cn-hangzhou'; //地域id
const PipelineId = '457cf7********2d77'; //管道ID
const ossLocation = 'oss-cn-hangzhou';
const bucket = 'sh*****-1'; //oss bucket名称
//此处为阿里云内置模板,转换1920全高清为m3u8+ts格式
const templateId = "S00000001-100040"; #转码模板ID,按需配置
const oss_input_object = "test_input.mp4"; //oss上面的路径
const oss_output_object = "output_test"; //输出后的oss路径
public static function createClient(){
$config = new Config([]);
$config->accessKeyId = self::accessKeyId;
$config->accessKeySecret = self::accessKeySecret;
$config->regionId = self::regionId;
$config->protocol = "HTTPS";
$config->endpoint = 'mts.cn-hangzhou.aliyuncs.com';
return new Mts($config);
}
public static function test(){
$client = self::createClient();
$request = new SubmitJobsRequest([
"input" => json_encode(array(
'Location' => self::ossLocation,
'Bucket' => self::bucket,
'Object' => urlencode(self::oss_input_object))
),
"outputBucket" => self::bucket,
"outputLocation" => self::ossLocation,
"pipelineId" => self::PipelineId,
"outputs" => self::outputs(),
]);
$response = $client->submitJobs($request);
//Console::log();
var_dump($response);
var_dump(Utils::toJSONString(Tea::merge($response->body)));
}
public static function outputs() {
$output = array('OutputObject' => urlencode(self::oss_output_object));
$output['TemplateId'] = self::templateId;
$outputs = array($output);
return json_encode($outputs);
}
}
php+wkhtmltoimage 将html转成图片 PHP
1.安装wkhtmltopdf
ubuntu 安装
sudo apt-get install wkhtmltopdf
centos 安装
sudo yum install wkhtmltopdf
2.php中使用thinkphp-template模板组件
$res = ThinkPHP::render('mobile',['html'=>$html]);
$filename = runtime_path().'/html/'.time().mt_rand(1,999).'.html';
file_put_contents($filename, $res);
$tempHtmlFile = $filename;
// 生成图像输出文件路径
$outputImageFile = runtime_path().'/html/res.png';
// 使用 wkhtmltoimage 命令行工具生成图像
//quality 质量 1-100
//width 宽度
//-disable-smart-width 禁用宽度自动调整
// --zoom 0.8 缩小分辨率
$command = "wkhtmltoimage --width 700 --quality 75 --disable-smart-width $tempHtmlFile $outputImageFile";
//exec($command);
exec($command, $output, $status);
if ($status == 0) {
echo "生成成功!";
} else {
echo "生成失败!状态码: " . $status;
print_r($output); // 查看详细的错误输出
}
if (file_exists($tempHtmlFile)) {
unlink($tempHtmlFile); // 删除临时文件
echo "临时文件已删除";
} else {
echo "临时文件不存在,无法删除";
}
使用mpdf 生成pdf文件 PHP
首先安装mpdf composer require mpdf/mpdf
public function testpdf(Request $request){
$mpdf = new Mpdf(['tempDir'=>runtime_path().'/pdftmp']);
$mpdf->autoScriptToLang = true;
$mpdf->autoLangToFont = true;
$html = <<<EOD
<h1 style='text-align:center;'>Hello World你好啊</h1>
EOD;
$mpdf->WriteHTML($html);
//public_path().'/pdf/'
$file = public_path().'/pdf/'.time().'.pdf';
$mpdf->Output($file,'F');
return response()->download($file, time().'.pdf');
}
webman nginx反向代理配置 PHP
upstream webman {
server 127.0.0.1:8787;
keepalive 10240;
}
server {
server_name 站点域名;
listen 80;
access_log off;
root /your/webman/public;
location ^~ / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
if (!-f $request_filename){
proxy_pass http://webman;
}
}
}
替换server_name 与 root即可
需要注意upstream设置,否则会导致下载大文件中断错误
使用webman框架 mysql 有很多sleep连接 PHP
webman使用长链接模式,每个进程都会开启一个mysql连接,不像fpm每次都是连接释放,webman不释放mysql链接,为了防止mysql没有操作而超时,断开连接,会有定时器 定时select 1 在这个期间没有操作数据库,就会显示sleep状态