音视频直播(Java)

Posted taluo2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频直播(Java)相关的知识,希望对你有一定的参考价值。

1 概述

1.1通用直播总体架构

 技术图片

 

 

 

 

    Java在用于视频开发时主要采用的技术框架是FFmpegOpenCV。数据库和其他的功能实现可以使用Java Web的相关技术就可以实现。

FFmpeg主要有两种网络传输协议;RTSPRTMP

RTSP;实时流传输协议,是TCP/IP协议体系中的一个应用层协议.RTSP在体系结构上位于RTPRTCP之上,它使用TCPUDP完成数据传输。

RTMP;实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。

从上面的简单描述可以看出,这两种协议完全符合808809协议的。

 

1.2 视频直播流程

 技术图片

 

 

 

 

 

2 具体实现方案

2.1 图像和声音同步流程

 技术图片

2.2 框架作用说明

OpenCV

1. 内置数据结构和输入/输出(In-build data structures and input/output)

 

  关于OpenCV的好处之一就是它提供了许多内置的用于图像处理和计算机视觉相关操作的基础元素。如果你需要通过scratch写入某些内容,你将不得不定义一些东西,比如图像、点、角度等等,这些几乎是任何计算机视觉算法的基础。OpenCV提供了这些开箱即用的基础数据结构,它们都包含在core模块中。另外一个好处是,这些数据结构都已经针对速度和内存做了优化,因此,你不用担心实现细节。

 

  imgcodecs模块用于处理读取和写入图像文件(image file)

 

2. 图像处理操作(Image processing operations)

 

3. 构建图形用户界面(Build GUI)

 

4. 视频分析(Video analysis)

 

5. 3D重建(3D reconstruction)

 

6. 特征提取(Feature extraction)

 

7. 目标检测(Object detection)

 

8. 机器学习(Machine learning)

 

9. 计算摄影(Computational photography)

 

10. 形状分析(Shape analysis)

 

11. 光流算法(Optical flow algorithms)

 

12. 人脸和目标识别(Face and object recognition)

 

13. 表面匹配(Surface matching)

 

14. 文本检测和识别(Text detection and recognition)

FFmpeg

1AVUtil: 核心工具库

2AVFormat:提供了音视频容器格式的封装和解析以及所支持的协议文件格式和协议库

3AVCodec: 编解码库

4AVFilter: 音视频滤镜库 如视频加水印、音频变声

5AVDevice: 输入输出设备库,提供设备数据的输入与输出,如读取摄像头数据、屏幕录制

6SwrRessample: 音频重采样

7SWScale: 图像格式转换的模块,yuv -> rgb

8PostProc:后期处理

 

3 编解码

3.1编解码流程

编码流程;

1、avformat_alloc_output_context2

初始化输出码流的 AVFormatContext

2avio_open

打开输出文件

3av_new_stream

创建输出码流的 AVStream

4avcodec_find_encoder

查找编码器。

5avcodec_open2

打开编码器

6avformat_write_header

写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说 MPEG2TS

7avcodec_encode_video2

编码一帧视频。即将 AVFrame(存储 YUV 像素数据)编码为 AVPacket(存储 H.264 等格式的码流数据)

8av_write_frame

将编码后的视频码流写入文件。

9flush_encoder

输入的像素数据读取完成后调用此函数。用于输出编码器中剩余的 AVPacket

10av_write_trailer

写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说 MPEG2TS)。

11释放资源

解码流程:

1av_register_all

先调用avcodec_register_all来注册所有config.h里面开放的编解码器,然后会注册所有的MuxerDemuxer(也就是封装格式),最后注册所有的Protocol(即协议层的东西)

2avformat_alloc_context

分配初始化一个AVFormatContext结构体

3avformat_open_input

解码时,根据文件路径判断文件格式,决定使用哪个Demuxer,构建好AVStream

4avformat_find_stream_info:

解码时,作用是从文件中提取流信,将所有的StreamMetaData信息填充好,先read_packet一段数据解码分析流数据

5穷举所有的流,查找其中种类为 CODEC_TYPE_VIDEO

6avcodec_find_decoder:

作用是找解码器,avcodec_resgister_all已经将解码器和编码器放到一个链表中,根据codec Idname循环遍历找出

 

7avcodec_open2

avcodec_open2(AVCodecContext, Codec, NULL)

作用是打开编码器或解码器

8avcodec_alloc_frame

为解码帧分配内存

9不停地从码流中提取出帧数据 av_read_frame:

解码时,读取出AVPacket,对应音频流,一个AVPacket可能包含多个AVFrame,对应视频流,一个AVPacket对应一个AVFrame

10判断帧的类型,对于视频帧调用: avcodec_decode_video

11avcodec_close:

释放解码器

12av_close_input_file

关闭输入文件

3.2 编解码相关技术

由于我们源程序采用的视频文件格式是flv,所以我这里先以flv的视频文件格式为例。

FFMPEG如果是压缩为FLV文件 3个编码可选

1. -c:v flv 标准FLV编码 这个好处是速度快 清晰度高的话 视频文件会比较大

2. -c:v vp6 VP6编码 这个大家都很少使用 其实这个也算不错

3. -c:v libx264 H.264编码 估计使用这个的比较多 优点是同等清晰度 视频文件更小 缺点就是转换慢的吐血

 

几种常见的视频编码格式;

首先纠正一下上面说的一个观点,其实mkvavi并不能说成是高清格式,所谓的高清(High Definition )指的是分辨率达到一定水平之上才称之为高清,像720p1080i1080pa1080a720816p 。进行高清视频编码时一般使用的编码格式为H.264VC-1,而进行封装时可以使用mkvmp4avi这类文件格式进行封装。所以mkvavi只是一种封装格式,里面装的视频如果是一个320x240分辨率的,那这个视频就不是一个高清视频。下面说说这几种格式的特点。

 

1mkvmkv不等同于音频或视频编码格式,它只是为这些进行过音视频编码的数据提供了一个封装的格式,简单的说就是指定音视频数据在文件中如何排列放置。

MKV最大的特点就是能容纳多种不同类型编码的视频、音频及字幕流,俗称万能媒体容器。

MKV加入AVI所没有的EDC错误检测代码,这意味着即使是没有下载完毕的MKV文件也可以顺利回放,这些对AVI来说完全是不可想象的。虽然MKV加入了错误检测代码,但由于采用了新的更高效的组织结构,用MKV封装后的电影还是比AVI源文件要小了约1%,这就是说即使加上了多个字幕,MKV文件的体积也不可能比AVI文件大。

MKV支持可变帧率,它可在动态画面中使用较大的帧率,而在静态画面中使用较小的帧率,这样可以有效的减少视频文件的体积,并改善动态画面的质量。它的作用比目前广泛使用的VBR(可变码率)更为明显。

 

2avi   可容纳多种类型的音频和视频流,他的封装格式比较老了,在功能上不能像mkv那样满足更多的需求

 

3rmvb  rm的升级版本,vb代表变比特率,意思是在画面平缓的时候采用低比特率,画面变化剧烈的时候采用高比特率,有效降低文件尺寸,又不影响太多画质。一般来说,一个700MBDVDrip 采用平均比特率为450Kbps的压缩率,生成的 RMVB 大小仅为400MB,但是画质并没有太大变化。但是由于编码器的关系,在画质上还是略输于h.264,所以现在压缩高清视频时更偏重于使用mkv封装。

 

4mp4   视频MP4格式实际上指的是使用MPEG-4编码格式、或使用MPEG-4衍生出来的编码格式进行编码的文件,比如DivXXviDH.263H.264MS MPEG-4 3688 Microsoft Video1 Microsoft RLE,此种文件格式功能不如mkv丰富。

 

5flv    FLV文件体积小巧,清晰的FLV视频1分钟在1MB左右,一部电影在100MB左右,是普通视频文件体积的1/3。再加上CPU占有率低、视频质量良好等特点使其在网络上盛行,目前网上的几家著名视频共享网站均采用FLV格式文件提供视频

 

6wmv   WMV是微软推出的一种流媒体格式,它是在同门ASFAdvancedStreamFormat)格式升级延伸来得。在同等视频质量下,WMV格式的文件可以边下载边播放,因此很适合在网上播放和传输。

可是由于微软本身的局限性其WMV的应用发展并不顺利。第一, WM9是微软的产品它必定要依赖着WindowsWindows 意味着解码部分也要有PC,起码要有PC机的主板。这就大大增加了机顶盒的造价,从而影响了视频广播点播的普及。第二,WMV技术的视频传输延迟非常大,通常要10几秒钟,正是由于这种局限性,目前WMV也仅限于在计算机上浏览WM9视频文件。

以上是关于音视频直播(Java)的主要内容,如果未能解决你的问题,请参考以下文章

java视频直播技术架构,面试心得体会

视频直播方案(加强版)

用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中

视频直播技术:实时视频编码之H264硬编码

微信小程序+腾讯云直播的实时音视频实战笔记

JAVA商城 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城 直播商城 短视频商城 springcloud商城 spring cloud商城