分类 默认分类 下的文章

下载,安装 FFmpeg

官网:http://ffmpeg.org
注意事项:下载时候不要选择 essential 版本,请选择 full 版本

安装:将解压后的 c:xxxbin 目录加入到环境变量

测试,附参数说明

转换、切片、生成索引一次性完成(效率太低,花费的时间长)
重要参数说明:
-c:v 指定视频的编码格式
-c:a 指定音频的编码格式
-hls_list_size 索引中保留的切片信息,默认值是 5 ,保留全部设为 0
-hls_time 10 每一个切片文件的时长,单位:秒

ffmpeg -i TESTVIDEO.MP4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 10 index.m3u8

高效版

推荐生产中使用,高效版分为两个步骤:

1.将原视频整体转码为 ts 格式
ffmpeg -y -i Test.mp4  -vcodec copy -acodec copy -vbsf h264_mp4toannexb EncodeTest.ts
2. ts 文件切片并生成索引
ffmpeg -i EncodeTest.ts -c copy -map 0 -f segment -segment_list Index.m3u8 -segment_time 10 TestSeg_%3d.ts

其他

ts 文件并不能在 H5 的 <video> 中直接播放,可以借助 video.js 来实现播放

准备一张表

create database dbtest;
use dbtest;
drop table if exists user;
create table user(
  id int not null primary key auto_increment,
  name varchar(20)
);

编写存储过程

delimiter //
create procedure fill_talbe(in count int)
begin
  set @int:1;
  while @init <= count do
    insert into user values(null, concat("user-", @init))
    set @init = @init + 1;
  end while;
end //
delimiter ;

调用存储过程

drop procedure if exists fill_table;
call fill_table(1000000);

其他

delimiter 是个创建函数、存储过程、触发器的基本框架套路

delimiter //

begin

end //
delimiter ;

要实现 java socket 功能,需要两台机器:一个服务端 Server.java , 一个客户端 Client.java

服务端 Server.java

// Server.java
public class Server{
  ServerSocket server = new ServerSocket(10010);
  // 使用 accept() 方法监听服务器的 10010 端口,并获取一个 socket 对象
  Socket socket = server.accept();
 
  // 使用 socket 对象获取一个网络输入流
  InputStream is = socket.getInputStream();

  // 准备一个 1024B 的缓冲区
  byte[] bs = new byte[1024];

  // 读取客户端发送的字节流数据
  int len = is.read(bs);
  
  // 使用 new String() 构造,将字节数组转换为字符串
  System.out.println(new String(bs));
}

客户端 Client.java

// Client.java
public class Server{
  // new 一个 socket 对象
  Socket socket = new Socket("localhost", 10010);

  // 使用 socket 对象获取一个网络输出流
  OutputStream os = socket.getOutputStream();

  // 准备向服务端发送的数据
  String strForServer = "hello Server";
  
  // 使用 getBytes() 方法,将字符串转换为字节数组,并发送给服务端
  os.write(strForServer.getBytes());
}

注意事项:

1.Java Socket 编程中:发送使用网络输出流,接收使用网络输入流。并且,网络流的获取都是使用 Socket 对象。
获取网络输入流: socket.getInputStream()
获取网络输出流: socket.getOutputStream()

2.关于 Socket 对象的获取
客户端获取使用 new 的方式
服务端则是通过 ServerSocket 对象的 accept() 方法

C# 中, 委托 ---> 匿名方法 ----> Lambda表达式 三者之间是层层演化的关系。


委托

什么是委托?委托也是一种类型,委托也是一种类型,委托也是一种类型,委托类型的变量指向方法。示例:

// 声明一个带有返回值的委托类型 Dtest
delegate int Dtest(int i, int j);

// 声明一个带有返回值的方法 Sum
public int Sum(int a, int b){
  return a + b;
}

// 声明一个委托变量,指向方法
Dtest devar = Sum;

// 通过委托调用一个方法
devar(1,2);

匿名方法

匿名方法,就是没有名字的方法。委托类型的变量不仅可以指向普通方法,也可以指向一个匿名方法。示例:

Func<string s,int r> f0 = delegate(string s1){
  return Convert.ToInt32(s);
};

匿名方法的声明,也是使用 delegate 关键字,如上。

Lambda 表达式

Lambda 表达式由匿名方法演进而来。示例:

Func<string s,int r> f0 = s1 => Convert.ToInt32(s);

如果只有一行代码,可以省略大括号和 return

其他,Action 与 Func

通常在业务开发中,开发者不必特意声明一个委托类型。使用系统内置的泛型委托 Action 和 Func 即可。两者的区别:
Action 是没有返回值的
Func 一定是有返回值的

Action ac = ()=> Console.WriteLine("hello world"); ac();
Action<int i, int j> ac2 = (a,b)=>Console.WriteLine(a+b); ac2(6,9);

Func<int i,int j> fun = i => i * 2;
int res = fun(3);

发布 asp.net6 项目时的配置

1、目标选择:文件

2、部署模式:独立

3、目标运行时: linux-x64

发布成功后,将项目打包并上传到 linux 服务器

linux 上的操作

1、在解压后的项目文件夹的同级目录中创建 Dockerfile

FROM centos

RUN yum -y install libicu

CMD mkdir -p /wwwroot/publish

COPY ./WebApplication /wwwroot/publish

WORKDIR /wwwroot/publish

CMD cd /wwwroot/publish

CMD chmod 777 WebApplication

EXPOSE 5000

ENTRYPOINT ./WebApplication

2、创建 docker 镜像到当前目录

docker build -t web-app:0.1 .

3、将 asp.net 项目以后台容器的方式运行

docker run -p 5000:5000 -d --name kestrel

可能会遇到的问题

1、Dockerfile 中的 From centos

因为 docker 中默认的centos:latest 是 centos8。但是centos8 已经停止维护,所以 yum 时候的源不可用。可以选择 centos7 也可以修改镜像。

修改镜像

1、启动一个 centos 的镜像实例

docker run -it -d centos

2、查看容器实例的 ID

docker ps
## 假如实例的 ID 是 c55dee3aa1de

3、将容器实例中的配置文件拷贝到宿主机目录,并进入宿主机目录

docker cp c55dee3aa1de:/etc/yum.respo.d ./etctmp
cd etctmp

4、修改配置文件 vim CentOS-Linux-BaseOS.repo 和 vim CentOS-Linux-AppStream.repo

两个文件的修改一致,主要是更换了 baseurl 的源

修改前

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/

修改后

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=http://vault.centos.org/$contentdir/$releasever/AppStream/$basearch/os/

5、反向操作,将宿主机中修改后的文件拷贝回容器中

docker cp ../etctmp c55dee3aa1de:/etc/yum.respo.d ./etctmp

6、从修改后的容器实例创建一个新的镜像

docker commit -m "fixed repos" -a "yourname" centos:8.fixed

7、修改 Dockerfile ,再次创建一个带有 asp.net 的镜像

FROM centos:8.fixed

8、再次执行Linux上的操作