一 相关技术说明
1 概述
1.1通用直播总体架构
Java在用于视频开发时主要采用的技术框架是FFmpeg和OpenCV。数据库和其他的功能实现可以使用Java Web的相关技术就可以实现。
FFmpeg主要有两种网络传输协议;RTSP、RTMP
RTSP;实时流传输协议,是TCP/IP协议体系中的一个应用层协议.RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。
RTMP;实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。
从上面的简单描述可以看出,这两种协议完全符合808和809协议的。
1.2 视频直播流程
2 具体实现方案
2.1 图像和声音同步流程
2.2 框架作用说明
OpenCV;
- 内置数据结构和输入/输出(In-build data structures and input/output)
关于OpenCV的好处之一就是它提供了许多内置的用于图像处理和计算机视觉相关操作的基础元素。如果你需要通过scratch写入某些内容,你将不得不定义一些东西,比如图像、点、角度等等,这些几乎是任何计算机视觉算法的基础。OpenCV提供了这些开箱即用的基础数据结构,它们都包含在core模块中。另外一个好处是,这些数据结构都已经针对速度和内存做了优化,因此,你不用担心实现细节。
imgcodecs模块用于处理读取和写入图像文件(image file)。
-
图像处理操作(Image processing operations)
-
构建图形用户界面(Build GUI)
-
视频分析(Video analysis)
-
3D重建(3D reconstruction)
-
特征提取(Feature extraction)
-
目标检测(Object detection)
-
机器学习(Machine learning)
-
计算摄影(Computational photography)
-
形状分析(Shape analysis)
-
光流算法(Optical flow algorithms)
-
人脸和目标识别(Face and object recognition)
-
表面匹配(Surface matching)
-
文本检测和识别(Text detection and recognition)
FFmpeg;
1、AVUtil: 核心工具库
2、AVFormat:提供了音视频容器格式的封装和解析以及所支持的协议文件格式和协议库
3、AVCodec: 编解码库
4、AVFilter: 音视频滤镜库 如视频加水印、音频变声
5、AVDevice: 输入输出设备库,提供设备数据的输入与输出,如读取摄像头数据、屏幕录制
6、SwrRessample: 音频重采样
7、SWScale: 图像格式转换的模块,yuv -> rgb
8、PostProc:后期处理
3 编解码
3.1编解码流程
编码流程;
1、avformat_alloc_output_context2:
初始化输出码流的 AVFormatContext
2、avio_open:
打开输出文件
3、av_new_stream:
创建输出码流的 AVStream
4、avcodec_find_encoder:
查找编码器。
5、avcodec_open2:
打开编码器
6、avformat_write_header:
写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说 MPEG2TS)
7、avcodec_encode_video2:
编码一帧视频。即将 AVFrame(存储 YUV 像素数据)编码为 AVPacket(存储 H.264 等格式的码流数据)
8、av_write_frame:
将编码后的视频码流写入文件。
9、flush_encoder:
输入的像素数据读取完成后调用此函数。用于输出编码器中剩余的 AVPacket。
10、av_write_trailer:
写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说 MPEG2TS)。
11、释放资源
解码流程:
1、av_register_all:
先调用avcodec_register_all来注册所有config.h里面开放的编解码器,然后会注册所有的Muxer和Demuxer(也就是封装格式),最后注册所有的Protocol(即协议层的东西)
2、avformat_alloc_context:
分配初始化一个AVFormatContext结构体
3、avformat_open_input:
解码时,根据文件路径判断文件格式,决定使用哪个Demuxer,构建好AVStream
4、avformat_find_stream_info:
解码时,作用是从文件中提取流信,将所有的Stream的MetaData信息填充好,先read_packet一段数据解码分析流数据
5、穷举所有的流,查找其中种类为 CODEC_TYPE_VIDEO
6、avcodec_find_decoder:
作用是找解码器,avcodec_resgister_all已经将解码器和编码器放到一个链表中,根据codec Id和name循环遍历找出
7、avcodec_open2:
avcodec_open2(AVCodecContext, Codec, NULL)
作用是打开编码器或解码器
8、avcodec_alloc_frame:
为解码帧分配内存
9、不停地从码流中提取出帧数据 av_read_frame:
解码时,读取出AVPacket,对应音频流,一个AVPacket可能包含多个AVFrame,对应视频流,一个AVPacket对应一个AVFrame
10、判断帧的类型,对于视频帧调用: avcodec_decode_video:
11、avcodec_close:
释放解码器
12、av_close_input_file:
关闭输入文件
3.2 编解码相关技术
由于我们源程序采用的视频文件格式是flv,所以我这里先以flv的视频文件格式为例。
FFMPEG如果是压缩为FLV文件 3个编码可选
-
-c:v flv 标准FLV编码 这个好处是速度快 清晰度高的话 视频文件会比较大
-
-c:v vp6 VP6编码 这个大家都很少使用 其实这个也算不错
-
-c:v libx264 H.264编码 估计使用这个的比较多 优点是同等清晰度 视频文件更小 缺点就是转换慢的吐血
3.3几种常见的视频编码格式;
首先纠正一下上面说的一个观点,其实mkv和avi并不能说成是高清格式,所谓的高清(High Definition )指的是分辨率达到一定水平之上才称之为高清,像720p、1080i、1080p、a1080、a720、816p 。进行高清视频编码时一般使用的编码格式为H.264、VC-1,而进行封装时可以使用mkv、mp4、avi这类文件格式进行封装。所以mkv、avi只是一种封装格式,里面装的视频如果是一个320x240分辨率的,那这个视频就不是一个高清视频。下面说说这几种格式的特点。
1、mkv:mkv不等同于音频或视频编码格式,它只是为这些进行过音视频编码的数据提供了一个封装的格式,简单的说就是指定音视频数据在文件中如何排列放置。
MKV最大的特点就是能容纳多种不同类型编码的视频、音频及字幕流,俗称万能媒体容器。
MKV加入AVI所没有的EDC错误检测代码,这意味着即使是没有下载完毕的MKV文件也可以顺利回放,这些对AVI来说完全是不可想象的。虽然MKV加入了错误检测代码,但由于采用了新的更高效的组织结构,用MKV封装后的电影还是比AVI源文件要小了约1%,这就是说即使加上了多个字幕,MKV文件的体积也不可能比AVI文件大。
MKV支持可变帧率,它可在动态画面中使用较大的帧率,而在静态画面中使用较小的帧率,这样可以有效的减少视频文件的体积,并改善动态画面的质量。它的作用比目前广泛使用的VBR(可变码率)更为明显。
2、avi 可容纳多种类型的音频和视频流,他的封装格式比较老了,在功能上不能像mkv那样满足更多的需求
3、rmvb 是rm的升级版本,vb代表变比特率,意思是在画面平缓的时候采用低比特率,画面变化剧烈的时候采用高比特率,有效降低文件尺寸,又不影响太多画质。一般来说,一个700MB的 DVDrip 采用平均比特率为450Kbps的压缩率,生成的 RMVB 大小仅为400MB,但是画质并没有太大变化。但是由于编码器的关系,在画质上还是略输于h.264,所以现在压缩高清视频时更偏重于使用mkv封装。
4、mp4 视频MP4格式实际上指的是使用MPEG-4编码格式、或使用MPEG-4衍生出来的编码格式进行编码的文件,比如DivX、XviD、H.263、H.264、 MS MPEG-4 3688 、 Microsoft Video1 、Microsoft RLE,此种文件格式功能不如mkv丰富。
5、flv FLV文件体积小巧,清晰的FLV视频1分钟在1MB左右,一部电影在100MB左右,是普通视频文件体积的1/3。再加上CPU占有率低、视频质量良好等特点使其在网络上盛行,目前网上的几家著名视频共享网站均采用FLV格式文件提供视频
6、wmv WMV是微软推出的一种流媒体格式,它是在“同门”的ASF(AdvancedStreamFormat)格式升级延伸来得。在同等视频质量下,WMV格式的文件可以边下载边播放,因此很适合在网上播放和传输。
可是由于微软本身的局限性其WMV的应用发展并不顺利。第一, WM9是微软的产品它必定要依赖着Windows,Windows 意味着解码部分也要有PC,起码要有PC机的主板。这就大大增加了机顶盒的造价,从而影响了视频广播点播的普及。第二,WMV技术的视频传输延迟非常大,通常要10几秒钟,正是由于这种局限性,目前WMV也仅限于在计算机上浏览WM9视频文件。
二 视频解决方案
- 概述
目前视频方案大概分为两个大的方向,即是;C++实现和Java实现。
其中C++实现又分了 Flash方案和非Flash方案。
2 C++方式
2.1 Flash的实现原理
2.1.1详细说明
车载终端在设备上加载了实时视频信息传输(主要由sim卡提供流量)。并将此信息发送给Flash插件。
Flash插件拿到相关信息,由于他们的流媒体数据格式不一致,所以Flash要进行解码操作,将格式解析成Flash可以处理的格式。
将获取到的视频流数据编码(现在C++中使用的是H263编码格式,这种编码格式是类似于H264国标的编码格式的),并将编码出来的文件压缩成为flv视频文件。在通过Flash插件进行视频播放。
上述视频文件处理过程严格遵守 JT/T 808 和 JT/T1078 协议。
2.2 Flash版本
2.2.1总体项目运行流程
2.2.2详细说明
1.808通讯前置机;其主要功能是安装了多卡设备和指挥器的作用,其作用一方面是兼容多种卡,另一个方面是分发从车载终端上获取的服务请求,并将该请求分发给各个服务器。
2.端口服务器的主要作用是实现推流。其本身并不具有编码推流的功能,其主要是将车载终端发过来的流原封不动的转发给TS服务器(控制台)。
功能清单;
l 主控服务器
l TS 服务器
l HTTP 接口服务器
l Nginx 服务器
l FileZilla Server
功能清单;
MS主控服务器;1.flash更新
2.websocket控件监听3.数据库连接使用4.系统日志管理
TS服务器;1.flash更新
2.HTML控件监听
Http端口服务器;1.实现流数据的转发
2.用于Http监听
服务器搭建(原来的C++程序由于又各种控制台,所以不能完全采用Linux系统);
服务器操作系统;
Windows Server 2008 以上
用以部署项目所需的各种程序和软件
项目名称
通用端口
网络协议
功能描述
FTP
21
https
用来存储历史视频
MySql数据库
3306
http
存放数据
tomcat
8080
http
部署启动web项目
nginx
443/80
https/http
推流服务和负载均衡
最低硬件配置要求为:
l CPU:至少 8 核
l 内存:至少 8G 内存
l 硬盘:至少 500G 硬盘
详细安装文档请查看《RV音视频监控系统部署手册V3.2.0》
2.3 非Flash版本
如果不采用Flash方式,那么编码和解码这个功能就没有了,自然而然车载终端传输上来的数据就不会在进行编解码。因此车载终端传过来的数据必须是可以直接播放的视频流。
详细流程;
说明;
1播放视频要么采用Flash播放(不会再进行编解码操作),要么使用开源的播放器集成到程序中,一起打包发布。开源播放器有很多,如;ff.play等。
2 与Flash方式方式相比,只有Flash这块去掉,其他部分没多大变化。但是车载终端肯定要进行改进,否则将无法获取视频。
3 Java方式
首先必须说明,在影音图像处理这块,Java并不占据优势。这块还是C语音做做强大。大家都在使用Java,应该很清楚Java的程序编译原理。
从上图可以知道Java并不能与硬件内部的程序直接交互,所以Java在处理图像时就必须依赖一个库,这个库文件提供了我们所需要的功能。下面采用的两种方式,其实都是为Java处理视频提供了库。
3.1 OpenCV版本
该版本是使用OpenCV和FFmpeg两个视频框架来实现的。
前置机主要功能;
(1)视频流媒体服务的转发。
(2)不同厂商sim卡兼容。
CS控制台功能;
(1)获取视频流数据,并进行解码编码,将编码后的数据推送给服务器。
(2)显示相关信息;如图
3.服务器功能;
(1) 数据库连接
(2) Nginx服务器搭建
(3) 日志管理
(4) 服务发现,转发、FTP文件服务等
注:该流程严格遵守《道路运输车辆卫星定位系统北斗兼容车载终端通讯协议技术规范JTT808》和《道路运输车辆卫星定位系统平台数据交换标准JTT809》协议。
视频处理详细流程;
(1)CS控制台通过808协议 中的应答方式获取视频相关信息。
CS控制台要对其进行编解码。并将对应的视频URL上传给服务器。
(2)服务器获得视频URL并通过负载均衡分发给其他的服务器,并通过nginx播放视频。其播放是通过浏览器播放。
(3)客户通过系统,点击想要看的车辆信息,观看实时视频和历史视频。
视频支持功能;
A 视频播放框的放大缩小B 画面显示实时车速,当前时间、车辆定位、车牌号。C 具有声音开关、视频传输速度等
3.2 video.JS版本
(1)Video.JS程序通过808协议获取到车载终端发送来的数据,此时的Vedio程序对其数据开始解析,并将解析出的数据打包成为视频文件。
(2)当Vedio程序在处理视频数据时,将数据的URL以及历史视频文件地址,并将视频相关信息存入数据库中。
(3)将视频数据存放在数据库。转发视频相关请求。对FTP文件进行管理。
(4)通过Adobe Flash Player播放插件或者开源播放器播放视频。
注:该流程也是严格遵守808和809协议。服务器架构和OpenCV版本一样。c