麻绳先生

做一些记录性的工作

javaCV初步使用之rtmp推流和在线播放

从设备获取视频流

参考链接
https://blog.csdn.net/eguid_1/article/details/52678775

这块内容主要是javaCV基本API的使用,代码非常简单,我将其写在了一个类中,位于
src/main/java/com/zkalan/capture下,然后再demo类中调用测试;需要注意的是,网
上的很多代码将画板canvas的销毁方式设置为EXIT_ON_CLOSE,这会导致java虚拟机直接
推出,资源无法释放。我认为正确的写法应该是DISPOSED_ON_CLOSE。

1
canvas.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

搭建rtmp推流服务器

通过nginx服务器和nginx-rtmp-module可以简单的搭建一个rtmp服务器,我将使用的nginx
编译版本放在了这里
,这是已经包含了nginx-rtmp-module的版本,使用非常简单,首先在配置文件,例如
nginx-win-rtmp.conf中,添加一段rtmp配置项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
rtmp {
server {
listen 1935;
chunk_size 4000;
#mylive就是直播项目名
application mylive {
live on;

# record first 1K of stream
record all;
record_path /tmp/av;
record_max_size 1K;

# append current timestamp to each flv
record_unique on;

# publish only from localhost
#allow publish 127.0.0.1;
#deny publish all;

#allow play all;
}
}
}

然后在命令行中启动nginx服务器,例如命令

1
start nginx.exe -c conf\nginx-win-rtmp.conf

最后,启动第一部分写好的demo程序,注意publish address应该是这样的格式
rtmp://localhost:port/mylive/,使用potplayer或者vlc访问该链接,测试推流是否成功。

在网页播放rtmp流

参考链接
https://blog.csdn.net/qq_30152271/article/details/84334734

操作起来很简单,就是创建一个静态网页,放到服务器目录下,启动任何一个静态服务器,例如
上文的nginx,访问该静态网页,只要地址填写正确,就可以观看推流内容了。

然而需要注意的是,videojs虽然声称是一个html5播放器,但它的5.x版本播放rtmp流时依然需要flash 支持,并且6.x及以后版本不支持rtmp播放,也许是为了真正的叫做“html5播放器”?

Demo地址

javaCV-rtmp-demo

浏览器效果图

Mybatis第一节

持久层技术解决方案有JDBC技术、Sping中对JDBC的简单封装、Apache的DBUtils等,这些都不是框架技术,后两者只是工具类。Mybatis是一个持久层框架,使用ORM思想实现了结果集的封装。ORM就是把数据库表和实体类及其实体类的属性对应起来。

环境搭建

  1. 创建maven工程并导入坐标;
  2. 创建实体类和dao的接口;
  3. 创建Mybatis的主配置文件SqlMapConfig.xml
  4. 创建映射配置文件;

注意事项

  1. 在Mybatis中把持久层的接口名称和映射文件也叫做Mapper;
  2. Mybatis的映射配置文件位置必须和dao接口的包结构相同;
  3. 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名;
  4. 映射配置文件的操作配置,id属性的取值必须是dao接口的方法名;
  5. 遵守3、4和5,不需要自己写dao接口实现类;

Mybatis连接池

提供了三种配置方式。
配置的位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用哪种连接池。

  • POOLED:采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。
  • UNPOOLED:采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用赤的思想。
  • JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器能拿到的DataSource不同。web和maven的war工程才可使用。tomcat服务器采用的连接池是dbcp连接池。

Mybatis中的事务

通过sqlsession对象的commit方法和rollback方法实现事务的提交和回滚。

SpringMVC第一节

SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级web框架,属于Spring FrameWork的后续产品,以及融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全部功能MVC模块,使用Spring可插入的MVC框架,从而在进行Web开发时,选择使用Spring MVC框架或集成其他MVC开发框架,如Struts2等。支持RESTful编程风格的请求。

  • 清晰的角色划分;
  • 分工明确,扩展灵活;

基本组件

DispatcherServlet前端控制器

用户i请求到达前端控制器,相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet降低了组件之间的耦合。

HandlerMapping处理器映射器*

HandlerMapping负责根据用户请求找到Handler,SpingMVC提供了不同的映射器实现不同的映射方式,例如配置文件方式、实现接口方式、注解方式等。

Handler处理器

开发中需要编写的具体业务控制器,由DispatcherServlet把用户的请求转发到Handler,由Handler对具体的用户请求进行处理。

HandlerAdapter处理器适配器*

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

View Resolver视图解析器*

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

View视图

SpringMVC框架提供了很多的View视图类型的支持,包括jstlView, freemarkerView, pdfView等。最常用的是jsp。一般情况下需要通过页面标签或页面模板技术将模型数据通过页面展示给用户。

RequestMapping

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

//可以作用于类和方法,支持分级映射
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {

String name() default "";

//别名path和value通用,用于指定url
@AliasFor("path")
String[] value() default {};

@AliasFor("value")
String[] path() default {};


//public enum RequestMethod {
// GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
//}
RequestMethod[] method() default {};

//限定传递的请求参数
String[] params() default {};

//用于指定限制请求的头条件
String[] headers() default {};

String[] consumes() default {};

String[] produces() default {};
}

请求参数的绑定

支持简单数据类型、对象、列表等。@RequestMapping(param={username=””})

自定义类型转换器

  1. 首先实现Converter接口;
  2. 在spring配置文件中配置自定义类型转换器;

Servlet原生API

HttpServletRequest、HttpServletResponse、HttpSession、ServletContext。

常用注解

  1. @RequestParam
  2. @RequestBody get方法不适用
  3. @PathVariable RESTful风格 WebClient模拟发送请求
  4. @RequestHeader
  5. @CookieValue 获取cookie的值
  6. @ModelAttribute
  7. @SessionAttributes 用于多次执行控制器方法间的参数共享

ResponseBody相应json数据

DispatcherServlet会拦截所有资源,导致静态资源,如image、css、js等也会被拦截,解决方法就是需要配置静态资源不拦截。

Docker

Docker是一个开源的应用容器引擎;支持将软件编译成一个镜像,然后在镜像中做好各种软件的配置工作,随后将镜像发不出去,其他使用者可以直接使用该镜像;运行中的这个镜像成为容器,其优点在于启动速度。

Docker核心概念

Docker主机Host

一个物理或虚拟的机器,用于执行Docker守护进程和容器;

Docker镜像Images

Docker镜像是用于创建Docker容器的模板;

Docker容器Container

容器是独立运行的一个或一组应用;

Docker客户端Client

客户端通过命令行或者其他工具使用Docker API和Docker的守护进程通信;

Docker仓库Registry

Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库,Docker Hub提供了庞大的镜像集合使用;

使用Docker

基本命令

script
1
2
3
4
yum install docker
docker -v
systemctl start docker
systemctl enable docker
script
1
2
3
4
docker search mysql #搜索mysql image
docker pull mysql #拉取镜像
docker images #查看镜像列表
docker rmi images-id #移除镜像

容器操作

script
1
2
3
4
5
6
7
docker run --name mymysql -d mysql:TAG #启动容器
docker ps #查看运行中的容器
docker ps -a #查看所有容器
docker stop container-id #停止容器
docker rm -a # 删除所有容器
docker run --name container-name iamge-name -d -p 1008:8080 #-p进行端口映射
docker logs container-id/container-name

其他命令

spring-boot和web开发

web开发

如何使用spring boot:

  1. 创建spring boot应用,选中需要的模块;
  2. spring boot已经默认将这些场景配置好,只需要在配置文件中指定少量配置就可与运行;
  3. 编写业务代码;

自动配置原理

webjars和静态资源映射规则

  1. 所有/webjars/**,都去classpath:/META-INF/resources/webjars查找资源;
    webjars:以jar包方式引入静态资源。

  2. “/**”访问当前项目的任何资源,静态资源文件夹

    1
    2
    3
    4
    5
    "classpath:/MEAT-INF/resources/",
    "classpath:/resources/",
    "calsspath:/static/",
    "calsspath:/puclic/",
    "/":当前目录的根目录
  3. 欢迎页:静态资源文件夹下的所有index.html页面,被”/**”映射;

  4. 所有的**/favicon.ico都是在静态资源文件夹下查找;

模板引擎

JSP、

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<properties>
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
</properties>

thymeleaf

导入语法空间

thymeleaf语法规则

  • 片段包含:jsp:include
    • th:insert
    • th:replace
  • 遍历:c:forEach
    • th:each
  • 条件判断c:if
    • th:if
    • th:unless
    • th:switch
    • th:case
  • 声明变量c:set
    • th:object
    • th:with
  • 任意属性修改支持prepend,append
    • th:attr
    • th:attrprepend
    • th:attrappend
  • 修改指定属性默认值
    • th:value
    • th:href
    • th:src
  • 修改标签体内容
    • th:text不转义
    • th:utext转义
  • 声明片段
    • th:fragment

thymeleaf表达式

  • Simple expressions:
    • Variable Expressions: ${…}
    • Selection Variable Expressions: *{…}
    • Message Expressions: #{…}
    • Link URL Expressions: @{…}
    • Fragment Expressions: ~{…}
  • Literals
    • Text literals: ‘one text’ , ‘Another one!’ ,…
    • Number literals: 0 , 34 , 3.0 , 12.3 ,…
    • Boolean literals: true , false
    • Null literal: null
    • Literal tokens: one , sometext , main ,…
  • Text operations:
    • String concatenation: +
    • Literal substitutions: |The name is ${name}|
  • Arithmetic operations:
    • Binary operators: + , - , * , / , %
    • Minus sign (unary operator): -
  • Boolean operations:
    • Binary operators: and , or
    • Boolean negation (unary operator): ! , not
  • Comparisons and equality:
    • Comparators: > , < , >= , <= ( gt , lt , ge , le )
    • Equality operators: == , != ( eq , ne )
  • Conditional operators:
    • If-then: (if) ? (then)
    • If-then-else: (if) ? (then) : (else)
    • Default: (value) ?: (defaultvalue)
  • Special tokens:
    • No-Operation: _

Spring Boot自动配置Spring MVC

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans;
  • Support for serving static resourcces, including support for Webjars;
  • Automatic registration of Converter, GenericConverter, Formatter beans;
  • Support for HttpMessageConerters;
  • Automatic registration of MessageCodeResolver;
  • Static index.html support;
  • Custom Favicon support;
  • Automatic use of a ConfigurableWebBindingInitializer bean;

修改Spring Boot默认配置

扩展Spring MVC

Tips

国际化

默认的区域信息是通过浏览器请求报文获取的。可以通过链接提交区域信息。
自己的信息解析器需要实现Localeresolver。

  1. 编写国际化配置文件,抽取页面需要配置的国际化信息;
  2. 使用ResourceBundleMessageSource管理国际化资源信息;
  3. 在页面使用fml:message获取国际化内容;
  4. 可以自己编写区域信息解析器,替换Spring Boot默认的解析器ResourceBundleMessageSource;

模板引擎要实时生效,需要禁用模板缓存,页面修改要ctrl+F9重新编译

登陆状态检查需要拦截器

thymeleaf公共页面元素抽取

  1. 抽取公共片段
  2. 引入公共片段
  3. 不同替换效果有th:insert、th:replace、th:include

错误处理的自动配置

可以参照ErrorMVCAutoConfiguration;容器中有如下组件:

  1. DefaultErrorAttributes
  2. BasicErrorController
  3. ErrorPageCustomizer
  4. DefaultErrorViewResolver

注册Servlet、Filter、Linstener

Spring Boot默认是以jar包的方式启动嵌入式的Servlet容器来启动Spring Boot的web应用,没有web.xml文件;
注册三大组件使用ServletRegistrationBean, FilterRegistrationBean, ServletListenerRegistrationBean。

其他嵌入式Servlet容器

Jetty

适合长连接

Undertow

后置处理器会获取所有容器中的定制器,以此配置Servlet容器,自己定义容器就是将自定义的定制器加到Bean工厂中。

嵌入式Servlet容器启动原理

  1. Spring Boot应用启动运行run方法;
  2. refreshContext(context);Spring Boot刷新IOC容器,创建IOC容器对象,并初始化容器,创建容器中的每一个组件,还判断了是否是web应用;
  3. refresh(context);刷新刚才创建好的ioc容器;
  4. onRefresh();web的IOC容器重写了onRefresh方法;
  5. web IOC容器会创建嵌入式的Servlet容器;createEmbeddedServletContainer();
  6. 获取嵌入式的Servlet容器工厂;TomcatEmbeddedServletContainerFactory创建对象,后置处理器随后获取所有的定制器来定制Servlet容器的相关配置;
  7. 使用容器工厂获取嵌入式的Servlet容器;
  8. 嵌入式的Servlet容器创建对象并启动Servlet容器;先启动嵌入式的Servlet容器,再将IOC容器中剩下的对象获取;

使用外置的Servlet容器

嵌入式Servlet容器优点在于简单、便携,缺点在于默认不支持JSP,优化定制不够复杂;使用定制器、自己编写嵌入式Servlet容器的创建工厂;

  1. 必须创建一个war项目,利用idea创建目录结构;
  2. 将嵌入式的Tomcat指定为provided;
  3. 必须编写一个SpringBootServletInitializer的子类,并调用configure方法;
  4. 启动tomcat;