安装
建议通过Composer来安装PHP-FFMpeg
$ composer require php-ffmpeg/php-ffmpeg
基本使用
注意:tp5需要全部添加斜杠,比如:$ffmpeg = \FFMpeg\FFMpeg::create();
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('video.mpg');
$video
->filters()
->resize(new FFMpeg\Coordinate\Dimension(320, 240))
->synchronize();
$video
->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
->save('frame.jpg');
$video
->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')
->save(new FFMpeg\Format\Video\WMV(), 'export-wmv.wmv')
->save(new FFMpeg\Format\Video\WebM(), 'export-webm.webm');
文档
这个文档是对API进行的引导介绍。建议去阅读源代码和配套的文档。
FFMpeg
FFMpeg\FFMpeg 是操作媒体主要的对象。可以使用静态调用FFMpeg\FFMpeg::create来创建。
$ffmpeg = FFMpeg\FFMpeg::create();
FFMpeg会自动探测 ffmpeg和ffprobe的二进制文件。如果你想给出确切的二进制文件路径, 可以通过一个数组来设置。 A Psr\Logger\LoggerInterface can also be passed to log binary executions.
$ffmpeg = FFMpeg\FFMpeg::create(array(
'ffmpeg.binaries' => '/opt/local/ffmpeg/bin/ffmpeg',
'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
'timeout' => 3600, // The timeout for the underlying process
'ffmpeg.threads' => 12, // The number of threads that FFMpeg should use
), $logger);
媒体操作
FFMpeg\FFMpeg根据URIs来创建媒体. URIs可以是本地的系统资源, HTTP网络资源,FFmpeg支持的任意资源。
注意:如果你想列出你用的FFmpeg支持的所有资源类型, 使用 -protocols 命令:
ffmpeg -protocols
使用 FFMpeg\FFMpeg::open 方法来打开一个资源。
$ffmpeg->open('video.mpeg');
两种类型的视频可以被处理: FFMpeg\Media\Audio 和 FFMpeg\Media\Video。第三种类型 FFMpeg\Media\Frame, 可以通过视频来处理。
Video
FFMpeg\Media\Video 可以被转码, ie: change codec, isolate audio or video. 帧可以提取。
转码
你可以通过FFMpeg\Media\Video:save方法对视频进行转码,你将通过 FFMpeg\Format\FormatInterface来实现。
请注意视频或音频的比特率需要在格式中设置。
$format = new Format\Video\X264();
$format->on('progress', function ($video, $format, $percentage) {
echo "$percentage % transcoded";
});
$format
-> setKiloBitrate(1000)
-> setAudioChannels(2)
-> setAudioKiloBitrate(256);
$video->save($format, 'video.avi');
转码的过程可以被实时监控, 看下面有关Format的文档了解更过信息。
提取图片
你可以用FFMpeg\Media\Video::frame 方法来提取任意时间的帧画面。
代码返回了一个媒体文件第42秒所对应的FFMpeg\Media\Frame 实例。你可以使用 FFMpeg\Coordinate\TimeCode 作为参数, 看专业文档了解更多。
$frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(42));
$frame->save('image.jpg');
如果你想从视频中获取多种图片,你可以使用下边的过滤器
$video
->filters()
->extractMultipleFrames(FFMpeg\Filters\Video\ExtractMultipleFramesFilter::FRAMERATE_EVERY_10SEC, '/path/to/destination/folder/')
->synchronize();
$video
->save(new FFMpeg\Format\Video\X264(), '/path/to/new/file');
生成一个波
你可以使用 FFMpeg\Media\Audio::waveform 方法来从音频文件中生成一个波。
代码返回一个 FFMpeg\Media\Waveform 实例。你可以设置不同的尺寸作为参数, 查看API文档了解更多。
输出文件必须使用PNG extension.
$waveform = $audio->waveform(640, 120);
$waveform->save('waveform.png');
如果你想从视频文件中得到一个波, 需要先把视频文件转换成音频文件。
// Open your video file
$video = $ffmpeg->open( 'video.mp4' );
// Set an audio format
$audio_format = new FFMpeg\Format\Audio\Mp3();
// Extract the audio into a new file
$video->save('audio.mp3');
// Set the audio file
$audio = $ffmpeg->open( 'audio.mp3' );
// Create the waveform
$waveform = $audio->waveform();
$waveform->save( 'waveform.png' );
Filters
你可以使用 FFMpeg\Media\Video::addFilter 方法在 FFMpeg\Media\Video上使用过滤器。 视频接受视频和音频的过滤器。
你可以创建你自己的过滤器并且PHP-FFMpeg也附带了一些,你可以通过 FFMpeg\Media\Video::filters 方法来使用它们。
过滤器是可以链接的
$video
->filters()
->resize($dimension, $mode, $useStandards)
->framerate($framerate, $gop)
->synchronize();
旋转
用给定的角度来旋转视频。
$video->filters()->rotate($angle);
$angle 的参数必须是下面的一个常量:
FFMpeg\Filters\Video\RotateFilter::ROTATE_90: 90° clockwise
FFMpeg\Filters\Video\RotateFilter::ROTATE_180: 180°
FFMpeg\Filters\Video\RotateFilter::ROTATE_270: 90° counterclockwise
调整尺寸
按照给定的尺寸调整视频的大小。
$video->filters()->resize($dimension, $mode, $useStandards);
调整尺寸的过滤器需要三个参数:
$dimension, 一个 FFMpeg\Coordinate\Dimension实例
$mode, FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_* constants常量中的一个。
$useStandards, 是否强制使用最新的比率标准的布尔
如果你想要视频处在一个非标准的比率, 你可以使用padding 过滤器 调整视频大小到想要的尺寸,包上黑色的条。
$video->filters()->pad($dimension);
pad 过滤器需要一个参数 :
$dimension, FFMpeg\Coordinate\Dimension的实例
然后的话不要忘记保存。
$video->save(new FFMpeg\Format\Video\X264(), $new_file);
水印
用给定的图片给视频文件添加水印。
$video
->filters()
->watermark($watermarkPath, array(
'position' => 'relative',
'bottom' => 50,
'right' => 50,
));
watermark 过滤器需要两个参数:
$watermarkPath, 你水印文件的路径; $coordinates, 一个定义水印放置位置的数组。你可以使用相对路径像上面展示的那样。或者使用绝对路径像这样:
$video
->filters()
->watermark($watermarkPath, array(
'position' => 'absolute',
'x' => 1180,
'y' => 620,
));
帧频
改变视频的帧频
$video->filters()->framerate($framerate, $gop);
framerate(帧频)过滤器需要两个参数:
$framerate, FFMpeg\Coordinate\Framerate的实例
$gop, a GOP value (integer)
Synchronize(同步)
同步的音频和视频
一些容器使用延迟可能会导致不同步的输出。过滤器可以解决这个问题。
$video->filters()->synchronize();
Clip(修剪)
在想要的点减掉视频。
$video->filters()->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30), FFMpeg\Coordinate\TimeCode::fromSeconds(15));
The clip filter(修剪的过滤器)需要两个参数:
$start, 一个FFMpeg\Coordinate\TimeCode实例, 指定开始剪切的点
$duration, 可选, 一个 FFMpeg\Coordinate\TimeCode实例, 指定要持续的时间
Audio(音频)
FFMpeg\Media\Audio 可以被转码, ie: 改变编码解码器, 隔离视频和音频。帧可以被提取。
Transcoding(转码)
你可以用FFMpeg\Media\Audio:save 方法来给音频文件转码。你可以通过FFMpeg\Format\FormatInterface 来实现。
Please note that audio kilobitrate is set on the audio format.
$ffmpeg = FFMpeg\FFMpeg::create();
$audio = $ffmpeg->open('track.mp3');
$format = new FFMpeg\Format\Audio\Flac();
$format->on('progress', function ($audio, $format, $percentage) {
echo "$percentage % transcoded";
});
$format
-> setAudioChannels(2)
-> setAudioKiloBitrate(256);
$audio->save($format, 'track.flac');
转码过程可以被实时监控, 看API文档了解更多。
Filters(过滤器)
你可以用FFMpeg\Media\Audio::addFilter 在FFMpeg\Media\Audio上应用过滤器的效果。只接受音频过滤器。
你可以创建你自己的过滤器并且PHP-FFMpeg也附带了一些,你可以通过 FFMpeg\Media\Audio::filters 方法来使用它们。
Metadata(元数据)
向音频文件中添加元数据。你可以数组的key=value键值对的形式添加你想要的元数据。如果过滤器中没有任何参数传递进来,那么所有的元数据将被从输入文件中删除。目前支持的数据有 title, artist, album, artist, composer, track, year, description, artwork
$audio->filters()->addMetadata(["title" => "Some Title", "track" => 1]);
//remove all metadata and video streams from audio file
$audio->filters()->addMetadata();
向音频文件中添加artwork
$audio->filters()->addMetadata(["artwork" => "/path/to/image/file.jpg"]);
注意: 当前ffmpeg (version 3.2.2) only supports 只支持 .mp3 文件的artwork输出
Resample(重采样)
重采样一个音频文件。
$audio->filters()->resample($rate);
重采样过滤器需要两个参数:
$rate, a valid audio sample rate value (integer)
帧
帧是视频文件在某一个时间点的图片,看API了解更多。
你可以使用 FFMpeg\Media\Frame::save 方法来保存帧。
$frame->save('target.jpg');
这个方法还有一个可选的布尔类型的参数。设置这个参数为true可以获得更加精确的图片,可能稍微花多一点的时间去执行。
Gif
GIf是从视频文件中提取的一系列的动画图片。
你可以使用 FFMpeg\Media\Gif::save 方法来保存gif文件。
$video = $ffmpeg->open( '/path/to/video' );
$video
->gif(FFMpeg\Coordinate\TimeCode::fromSeconds(2), new FFMpeg\Coordinate\Dimension(640, 480), 3)
->save($new_file);
这个方法有一个可选的布尔类型的参数,就是动画的持续时间。如果设置的话,可以得到一个确切的gif图片。
Concatenation(串联)
这个特性能够让你用混合的资源来生成一个视频或者音频。
现在有两种串联视频的方式,根据资源的编码解码器。如果你的资源都是采用的同一种编码解码器的话,你使用 FFMpeg\Media\Concatenate::saveFromSameCodecs 更好一些。 如果你的资源采用不同的编码解码器, 你要用到 FFMpeg\Media\Concatenate::saveFromDifferentCodecs.
The first function will use the initial codec as the one for the generated file. With the second function, you will be able to choose which codec you want for the generated file.
You also need to pay attention to the fact that, when using the saveFromDifferentCodecs method, your files MUST have video and audio streams.
In both cases, you will have to provide an array of files.
To concatenate videos encoded with the same codec, do as follow:串联采用相同编码解码器的视频文件的话,参照下边的方法:
// In order to instantiate the video object, you HAVE TO pass a path to a valid video file.
// We recommand that you put there the path of any of the video you want to use in this concatenation.
$video = $ffmpeg->open( '/path/to/video' );
$video
->concat(array('/path/to/video1', '/path/to/video2'))
->saveFromSameCodecs('/path/to/new_file', TRUE);
保存函数中的布尔参数能让你使用拷贝的参数,这个参数可以大福度提高编码文件的生成过程。
To concatenate videos encoded with the same codec, do as follow:
// In order to instantiate the video object, you HAVE TO pass a path to a valid video file.
// We recommand that you put there the path of any of the video you want to use in this concatenation.
$video = $ffmpeg->open( '/path/to/video' );
$format = new FFMpeg\Format\Video\X264();
$format->setAudioCodec("libmp3lame");
$video
->concat(array('/path/to/video1', '/path/to/video2'))
->saveFromDifferentCodecs($format, '/path/to/new_file');
在 FFMPEG中更多关于串联的细节 可看这里 here, here and here.
Formats(格式)
格式要实现 FFMpeg\Format\FormatInterface。 用FFMpeg\Format\VideoInterface来保存视频文件, 用 FFMpeg\Format\AudioInterface 来保存音频文件。
FFMpeg\Format\ProgressableInterface的话可以获得转码的实时信息。
预定义的格式已经提供了事件的过程信息。
$format = new Format\Video\X264();
$format->on('progress', function ($video, $format, $percentage) {
echo "$percentage % transcoded";
});
$video->save($format, 'video.avi');
为事件提供的回调函数可以随时调用。
Add additional parameters
你可以根据你的视频格式为你的编码提供额外的参数。
setAdditionalParameters 方法的参数是一个数组。
$format = new Format\Video\X264();
$format->setAdditionalParameters(array('foo', 'bar'));
$video->save($format, 'video.avi');
创建你自己的格式
创建一种新的格式最简单的方法就是集成抽象类 FFMpeg\Format\Video\DefaultVideo and FFMpeg\Format\Audio\DefaultAudio,并且实现下面的方法。
class CustomWMVFormat extends FFMpeg\Format\Video\DefaultVideo
{
public function __construct($audioCodec = 'wmav2', $videoCodec = 'wmv2')
{
$this
->setAudioCodec($audioCodec)
->setVideoCodec($videoCodec);
}
public function supportBFrames()
{
return false;
}
public function getAvailableAudioCodecs()
{
return array('wmav2');
}
public function getAvailableVideoCodecs()
{
return array('wmv2');
}
}
Coordinates(坐标)
FFMpeg 使用很多单元来确定时间和空间坐标。
FFMpeg\Coordinate\AspectRatio 表示长宽比
FFMpeg\Coordinate\Dimension 表示一个维度
FFMpeg\Coordinate\FrameRate 表示帧速率
FFMpeg\Coordinate\Point 表示一个点
FFMpeg\Coordinate\TimeCode 表示一个时间码
FFProbe
FFMpeg\FFMpeg 内部使用FFMpeg\FFProbe来检查媒体文件。你也可以用它提取元数据。
$ffprobe = FFMpeg\FFProbe::create();
$ffprobe
->streams('/path/to/video/mp4') // extracts streams informations
->videos() // filters video streams
->first() // returns the first video stream
->get('codec_name'); // returns the codec_name property
$ffprobe = FFMpeg\FFProbe::create();
$ffprobe
->format('/path/to/video/mp4') // extracts file informations
->get('duration'); // returns the duration property
使用 Silex Microframework
Service provider is easy to set up:
$app = new Silex\Application();
$app->register(new FFMpeg\FFMpegServiceProvider());
$video = $app['ffmpeg']->open('video.mpeg');
下面是一些可能的选项:
$app->register(new FFMpeg\FFMpegServiceProvider(), array(
'ffmpeg.configuration' => array(
'ffmpeg.threads' => 4,
'ffmpeg.timeout' => 300,
'ffmpeg.binaries' => '/opt/local/ffmpeg/bin/ffmpeg',
'ffprobe.timeout' => 30,
'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',
),
'ffmpeg.logger' => $logger,
));
- linux
- lanmp
- lanmp
- apache
- Apache2.4.x与Apache2.2.x的一些区别
- 跨域请求 Apache 服务器配置
- apache服务器安装配置ssl数字证书,https访问
- put请求跨区
- apache允许跨域请求 & ajax 自定义header
- 自定义header
- 安装最新版openssl
- nginx
- 解决Nginx出现403 forbidden的方法
- nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)
- 如何用linux命令查看nginx是否在正常运行
- nginx反向代理
- nginx 编译安装
- nginx重定向
- 一个域名对应多个vue项目
- 关于http和https允许请求设置header问题
- nginx配置ssl证书
- 配置宝塔nginx支持tp5路由规则
- nginx获取自定义请求头header
- mysql
- 创建还量表
- 解决Navicat 出错:1130-host . is not allowed to connect to this MySql server,MySQL
- mysql慢查询
- explain
- 索引
- sphinx
- coreseek(sphinx)错误:WARNING: attribute 'id' not found - IGNORING原因及解决方法
- coreseek在windows安装问题和使用步骤
- coreseek常见错误
- coreseek php操作
- mysql5.6升级5.7.21
- sql操作
- mysql函数
- phpmyadmin上传文件大小限制
- mysql主从复制
- 单机主从配置
- 修改mysql端口后修改相应的phpmyadmin端口
- MERGE分表
- MySQL 5.7.22 多实例安装(二进制免编译安装模式)
- 解决phpmyadmin mysqli_real_connect(): (HY000/2002): No such file or directory错误
- Mysql服务器无法存emoji表情的解决方案
- /var/run/mysqld 目录每次重启后都需要手动去创建并赋权mysql用户才能起到mysql
- mysql排序
- mysql关键字冲突
- mysql备份
- mysql5.7密码修改
- 更改MySQL数据库目录位置
- mysql5.6安装
- 字符集与排序规则
- mysql 锁
- mysql事务性
- php
- centos7 升级 php 5.4 -> php5.6
- php扩展
- linux切换默认php版本(宝塔)
- vsftpd
- 关于vsftp出现Restarting vsftpd (via systemctl): Job for vsftpd.service failed because the control 的解决办法
- vdb
- fdisk
- parted
- 磁盘小知识
- CentOS7.x系统根目录分区扩容
- Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令
- 添加swap交换区
- root
- Centos创建和修改用户及密码命令
- linux 命令终端提示符显示-bash-4.2#解决方法
- firewall
- centOS7下安装GUI图形界面
- 在Linux主机上,安装上传下载工具包rz及sz
- ping: www.baidu.com: Name or service not known centos7
- linux中 you have newmail in /var/spool/mail/root
- CentOS7启动SSH服务报:Job for ssh.service failed because the control process exited with error code.......
- ifconfig,netstat 命令找不到解決办法
- CentOS7系统时间与真实时间相差8小时
- Centos7:利用crontab定时执行任务
- crontab命令
- /usr/bin/curl 执行外链
- speedtest-cli命令,网速测试
- yum 卸载命令
- 用户管理
- PATH环境变量
- rpm 命令
- 防火墙和网络的安装
- nohup
- vim命令
- 清理缓存命令
- 错误集
- tar解压包的时候出现错误 gzip: stdin: not in gzip format
- 在linux下创建自定义service服务
- 时钟同步
- 查找大文件
- redis
- yum安装
- redis主从复制
- php用法
- redis表的特性
- redis 锁
- redis事务
- redis主从配置+哨兵模式
- redis应用场景
- redis高并发集群下常见问题
- redis思维导图
- 脑图1
- 脑图2
- redis编码
- redis字符串编码
- hash编码
- list编码
- set编码
- zset编码
- 内存回收和内存共享
- redis小知识点
- ffmpeg
- yum安装ffmpeg
- ffmpeg-php类库安装及使用
- make安装
- WebRTC
- 房间服务器
- 信令服务器
- 打洞服务器
- PHP识别二维码(php-zbarcode)
- centos7.4安装Imagemagick
- 第二种方式
- linux小知识
- 查看日志命令
- linux CPU使用率过高或负载过高的处理
- swoole安装
- mq安装
- RabbitMQ安装
- php-amqplib使用--基本使用
- RabbitMQ使用技巧
- tp5
- problem
- thinkphp5的mkdir() Permission denied问题
- 5.5版本以上”No input file specified“问题解决
- 路由带参数的翻页,第二页无数据
- 报错A non well formed numeric value encountered(Thinkphp5时间戳自动转换问题)
- order排序没反应
- tp5分页--搜索
- tp5文件上传---宝塔
- 小知识
- return
- volist标签中使用eq标签 下拉列表选中selected
- TP5写入避免某字段重复的问题
- tp5 --url大小写
- tp5接收数组
- json存储与查询
- 接收参数为null
- php替换str_replace的使用方法,支持多个替换
- postman传数组参数
- Request 排除变量传参
- sql连表统计查询
- php循环
- 模型column方法
- 修改器与获取器
- mysql数据库group与order不能同时使用
- mysql三表查询
- json数据
- 获取数组第一个获第二个元素的键值
- mysql除以100计算
- mysql分组统计
- tp5.1 高级查询之 表里2字段比较大小
- whereOr()用法
- param数字参数,不能用==判断相等,需要用=来判断
- if判断
- tp5随机排序
- 短链接算法
- $_FILES["file"]二进制数据获取
- 跨域
- web.config
- iis: httpd相应标头
- thikphp模板中一维数组如何循环
- tp5 视频上传及自定义命名
- 搜索附近的人
- 小程序
- uploadFile:fail Error: unable to verify the first certificate
- 安卓手机打开小程序提示:request:fail ssl hand shake error
- tp5.1引入库文件
- composer
- tp5小知识
- TP5.1隐藏public和index.php
- tp5扩展
- 二维码
- phpexcel
- 谷歌验证码
- 谷歌验证码2
- mysql时间统计
- union合并查询并分页
- tp5底层框架学习
- php未知函数
- 类的知识点
- 三大设计模式
- 反射机制
- php常用内置类
- php小知识点
- 变量,函数名,参数前加&,什么意思
- PHP中 比较 0、false、null,'' "
- php小常识
- php缓存
- Trait特性
- php -- 取路径:getcwd()、DIR、FILE 的区别
- php关于类的常用概念
- php 类与对象全面了解
- php命名空间与引入
- php常见魔法常量
- php常见魔法函数
- PHP 超级全局变量
- tp5.1本身小知识
- 框架运行流程
- 框架教程总结
- 类的自动加载
- 配置文件
- ArrayAccess用法
- yaconf学习
- yaml学习
- config类重点
- php小知识2
- 多语言切换
- jwt(token)
- redis连接池
- 百度富文本
- 图片路径转换
- layui
- 复选框
- 获取视频第几帧作为封面图
- mysql查询
- FIND_IN_SET(str,strlist)
- PHP
- 函数取整
- array
- 日期
- header
- php获取一维,二维数组长度的方法
- php中数组和字符串的相互转换
- php对数组开头与末尾的元素进行插入与移除
- 队列
- PHP substr截取中文字符出现乱码的问题解疑
- foreach遍历数组并添加属性(下标)
- 数组排序
- PHP实现保留两位小数的三种方法
- 对象转数组
- php小知识
- 阻塞IO和非阻塞IO,异步与同步的区别
- 后台运行
- 超时
- php 高精度计算的问题
- move_uploaded_file
- PHP SplQueue 队列简介
- @,&&等php符号
- PHP命令行脚本接收传入参数的三种方式
- php执行linux命令
- 一些封装函数
- PHP获取文件大小
- PHP 生成随机字符串与唯一字符串
- PHP去除emoji表情
- ip
- php把时间计算成几分钟前,几小时前,几天前的函数
- https
- ssl证书
- 远程登入密码和端口修改
- apache配置https
- problems
- 响应状态status为canceled,解决办法
- PHP Restful PUT方法的参数提交及接收
- HTTP之预检,两种请求
- http增删改查理解
- js
- js数组与字符串的相互转换
- js移除Array中指定元素
- 使用sessionStorage、localStorage存储数组与对象
- 子页面调用父页面方法
- input文件上传
- 随机字符串
- 数组操作
- js 传递数组
- token接入验证
- 用文件来保存token
- 删除用户资料
- 微信function
- 接入验证及点击事件
- 基础token
- 获取用户资料
- curl
- 链接分享
- 网页授权登入
- 微信被动回复用户消息
- 生成微信二维码
- WxPay
- 单一文件,不能加额外参数
- tp5引用微信支付官方库文件
- 微信二维码支付
- 其他
- 手机端发送ajax请求,后台有可能会接收不到到请求(360浏览器和ie浏览器)
- 短信发送
- git
- postman无法正常返回结果Could not get any response
- web服务器配置
- 高并发方案
- nginx防盗链和限制请求速度
- 高并发概念与测试工具
- 定时秒杀方案
- web接口
- yzdd
- 接口1
- 接口2
- spx
- 接口说明
- 新闻表sbh_artnews字段说明
- 用户表sbh_homeuser
- 用户认证表sbh_usertrue
- txsh
- 接口_txsh_1
- chat消息格式
- 表字段
- txsh_第三方接口
- GatewayWorker
- 向对方发送消息,对方会掉线
- 负载均衡
- html
- html中引入调用另一个html的方法
- python
- linux安装--python3.6
- Centos7卸载Python2.7之后恢复yum
- pycharm汉化
- python错误集
- fatal error: Python.h: No such file or directory
- Python小知识
- python中两个重要的工具setuptools和pip的安装
- 基础知识点
- 学习笔记
- tornado基础流程
- 请求与响应
- 以太坊
- 以太坊账户管理
- 一些方法的更新弃用
- 小知识点
- web3.eth.accounts 和 web3.eth.personal 创建account的区别
- web3.py中sendTransaction和sendRawTransaction之间的区别
- 测试网和主网区别
- 以太坊gas、gaslimit、gasPrice、gasUsed详解
- web安全
- web渗透--全面介绍
- 大概介绍
- xss--介绍
- sql注入-介绍
- 文件上传下载-介绍
- 越权--介绍
- xxe--介绍
- 暴力破解
- xss漏洞安全编码系列详解
- 反射型
- DOM型
- 存储型
- 图片隐写
- sql注入详解
- 数据库和其他--介绍
- mysql爆破
- web安全--工具
- sqlmap
- 介绍与安装
- sqlmap攻击方式
- Sqlmap中的其他
- sqlmap--get攻击
- sqlmap--post攻击
- sqlmap--常用选项及命令
- sqlmap--详解
- sqlmap--查看
- web安全简单总结
- api功能扩展
- 阿里云短信
- 阿里云短信sdk新版用法
- 阿里云对象存储 OSS
- 七牛云上传
- qq邮箱发送短信验证码
- 通过ip获取归属地
- 支付插件
- zoujingli
- swoole
- swoole启动关闭方案
- swoole服务端主动推送消息
- 创建websocket--systemctl自定义启动服务
- 创建php脚本来启动关闭websocket服务
- swoole小知识
- 进程/线程结构图
- 区块链
- 区块链概念理解
- usdt小知识点1
- 区块链架构1.0、2.0与3.0梳理
- 理解usdt和代币,智能合约,基础货币
- 波场tron
- 账号创建
- 代币转账