基本命令

查看 FFmpeg 版本

ffmpeg -version

查看支持的编解码器

ffmpeg -codecs

查看支持的格式

ffmpeg -formats

获取输入文件信息

ffmpeg -i input.mov

格式转换

将 MOV 转换为 MP4

ffmpeg -i input.mov output.mp4

将 AVI 转换为 MP4

ffmpeg -i input.avi output.mp4

将音频文件转换为 MP3

ffmpeg -i input.wav output.mp3

视频压缩

FFmpeg 可以通过调整比特率、分辨率和编码器等方式压缩视频。以下是一些压缩视频的常用方法:

通过设置比特率压缩视频

ffmpeg -i input.mp4 -b:v 1000k output.mp4

-b:v 选项设置视频的比特率(此处为 1000 kbps)。

通过设置视频质量压缩视频(使用 CRF 参数)

ffmpeg -i input.mp4 -vcodec libx264 -crf 23 output.mp4

-crf 参数用于控制质量(值越小,质量越高,文件越大;值越大,质量越低,文件越小)。通常范围是 18 到 28。

通过调整分辨率压缩视频

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4

-vf scale=width:height 选项用于设置输出视频的分辨率。

提取音频

从视频中提取音频

ffmpeg -i input.mp4 -vn -acodec copy output.aac

-vn 选项表示不包括视频流。

从视频中提取音频并转换为 MP3

ffmpeg -i input.mp4 -q:a 0 -map a output.mp3

-q:a 0 选项表示高质量音频(VBR)。

裁剪视频

裁剪视频的前 30 秒

ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:30 -c copy output.mp4

-ss 选项表示开始时间,-t 选项表示持续时间。

从视频的第 10 秒开始截取到结束

ffmpeg -i input.mp4 -ss 00:00:10 -c copy output.mp4

合并视频

合并多个视频文件

首先,创建一个包含所有视频文件路径的文本文件(如 filelist.txt),内容格式如下:

file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

使用 FFmpeg 进行合并:

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

视频转码

使用 H.264 编码器进行转码

ffmpeg -i input.mp4 -vcodec libx264 -preset fast -crf 23 -acodec aac -b:a 128k output.mp4

-preset 选项控制编码速度和压缩比,常用值包括 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。

其他有用的命令

显示输入视频的帧数、帧率、时长等信息

ffprobe -v error -show_entries format=duration:stream=avg_frame_rate:frame=pkt_pts_time input.mp4

提取视频帧

ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -q:v 2 frames_%04d.jpg

上面的命令将提取所有关键帧(I 帧)并保存为图像文件

https://github.com/BtbN/FFmpeg-Builds/releases

添加 FFmpeg 到系统路径

  • 打开“系统属性” -> “高级系统设置” -> “环境变量”。
  • 在“系统变量”中找到“Path”,并点击“编辑”。
  • 添加 FFmpeg 的 bin 目录路径。

MOV 转换为 MP4 格式

ffmpeg -i input.mov output.mp4

其他选项

FFmpeg 提供了许多选项来控制视频和音频的编码参数。例如,你可以指定视频编码器、音频编码器、比特率等。

ffmpeg -i input.mov -c:v libx264 -c:a aac -b:v 1000k -b:a 128k output.mp4
  • -c:v libx264:使用 H.264 视频编码器。
  • -c:a aac:使用 AAC 音频编码器。
  • -b:v 1000k:设置视频比特率为 1000 kbps。
  • -b:a 128k:设置音频比特率为 128 kbps。

热模块替换(Hot Module Replacement,简称 HMR)是一种允许在应用程序运行时替换、添加或删除模块,而无需完全刷新页面的功能。它可以极大地提升开发效率,因为你可以实时看到代码修改的效果,而不必每次都手动刷新页面。

Parcel中的HMR
Parcel 默认支持热模块替换。它会在后台自动处理你的代码变更,并在文件更新时自动刷新浏览器。如果你在编辑 index.html 或其他文件时,发现连接断开且需要重新启动开发服务器,说明可能存在配置问题或 Parcel 未能正确应用 HMR。

OpenSSH和OpenSSL并不是直系亲属,顶多算有共同志向的兄弟。

他们是由不同的团队开发,有不同目的,但都是开放源码,为安全通信提供支持。

  • SSl是通讯链路的附加层,可以包含很多协议 https,ftps……
  • SSH只是加密的shell,最初是用来替代telnet的,通过port forward,也可以让其他协议通过ssh的隧道 起到加密的效果
  • OpenSSL:一个C语言函数库,是对SSL协议的实现
  • OpenSSH:是对SSH协议的实现
  • SSH利用OpenSSL提供的库。OpenSSH依赖于OpenSSL,没有OpenSSL的话OpenSSH就编译不过去,也运行不了

1. 捕获 this 上下文

箭头函数最常用的一个场景是避免 this 绑定问题。在普通函数中,this 的值会根据调用方式而变化,而箭头函数会捕获其所在上下文的 this。

class Person {
    constructor(name) {
        this.name = name;
    }

    printNameWithDelay() {
        setTimeout(() => {
            console.log(this.name);
        }, 1000);
    }
}

const person = new Person('John');
person.printNameWithDelay(); // 1秒后输出 'John'

在上面的代码中,如果使用普通函数,this 会在 setTimeout 的回调函数中指向全局对象(在严格模式下是 undefined),而箭头函数则保持了 this 指向 Person 实例。

2. 简化回调函数

箭头函数可以简化回调函数的书写,使代码更加简洁。

const numbers = [1, 2, 3, 4, 5];

// 普通函数写法
const squares = numbers.map(function (number) {
    return number * number;
});

// 箭头函数写法
const squaresArrow = numbers.map(number => number * number);

console.log(squaresArrow); // [1, 4, 9, 16, 25]

3. 处理数组的高阶函数

箭头函数在处理数组的高阶函数时非常方便。

const users = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 30 },
    { name: 'Carol', age: 35 }
];

// 使用箭头函数
const names = users.map(user => user.name);

console.log(names); // ['Alice', 'Bob', 'Carol']
cd D:\myDev
git init
  • 设置用户名 密码
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ git config --list

git config命令的--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库

使用 Git 管理项目

添加文件到仓库:

git add .

在 VS Code 中打开集成终端,导航到相应的项目文件夹,添加文件到仓库:

提交更改:

提交更改并添加提交信息:

git commit -m "Initial commit"

添加远程仓库

git remote add origin <远程仓库URL>

获取当前幻灯片的索引

const currentSlideIndex = $('.your-slider').slick('slickCurrentSlide');
console.log(currentSlideIndex);

跳转到指定的幻灯片

$('.your-slider').slick('slickGoTo', 3); // 跳转到索引为3的幻灯片

增加或删除幻灯片

// 增加幻灯片
$('.your-slider').slick('slickAdd', '<div>New Slide</div>');

// 删除幻灯片
$('.your-slider').slick('slickRemove', 2); // 删除索引为2的幻灯片

自动播放控制

// 开始自动播放
$('.your-slider').slick('slickPlay');

// 停止自动播放
$('.your-slider').slick('slickPause');

动态设置选项

$('.your-slider').slick('slickSetOption', 'autoplay', true, true); // 动态设置自动播放

事件处理

Slick 提供了许多事件,可以用来响应幻灯片的变化。

$('.your-slider').on('beforeChange', function(event, slick, currentSlide, nextSlide) {
    console.log('幻灯片即将从', currentSlide, '切换到', nextSlide);
});

$('.your-slider').on('afterChange', function(event, slick, currentSlide) {
    console.log('当前幻灯片为', currentSlide);
});

创意交互效果示例

1. 幻灯片淡入淡出效果

通过自定义样式和事件,可以实现幻灯片淡入淡出的效果。

.fade-slide {
    opacity: 0;
    transition: opacity 0.5s;
}

.fade-slide.slick-active {
    opacity: 1;
}
$('.your-slider').slick({
    slidesToShow: 1,
    fade: true
});

2. 幻灯片背景色变化

根据当前幻灯片的索引,动态改变轮播图容器的背景色。

const colors = ['red', 'blue', 'green', 'yellow'];

$('.your-slider').on('beforeChange', function(event, slick, currentSlide, nextSlide) {
    $('.slider-container').css('background-color', colors[nextSlide]);
});

步骤1:创建一个签名

验证现有的公钥和私钥是否匹配,通常的方法是通过使用私钥加密一段数据然后尝试用对应的公钥解密它,或者使用私钥签名一段数据然后用公钥验证签名。如果解密或验证签名成功,那么可以认为这对公钥和私钥是匹配的。下面是一个基于命令行工具OpenSSL的验证示例:

   echo "This is a test." > test.txt

使用私钥对文件进行签名。
假设你的私钥文件名为private_key.pem,你可以使用以下命令来为test.txt文件创建一个数字签名:

   openssl dgst -sha256 -sign private_key.pem -out test.sig test.txt

这将使用SHA-256算法对文件test.txt进行数字签名,并将签名保存到test.sig文件中。

步骤2:使用公钥验证签名

openssl dgst -sha256 -verify public_key.pem -signature test.sig test.txt

使用对应的公钥来验证签名。
假设你的公钥文件名为public_key.pem,可以使用以下命令来验证签名是否由该公钥对应的私钥生成:

   openssl dgst -sha256 -verify public_key.pem -signature test.sig test.txt

如果签名验证成功,你将看到如下输出:

   Verified OK

如果公钥和私钥不匹配,或者文件在签名后被修改过,验证将失败,OpenSSL会输出:

   Verification Failure