<kbd id='rvVNkTpR8ytr4j5'></kbd><address id='rvVNkTpR8ytr4j5'><style id='rvVNkTpR8ytr4j5'></style></address><button id='rvVNkTpR8ytr4j5'></button>

              <kbd id='rvVNkTpR8ytr4j5'></kbd><address id='rvVNkTpR8ytr4j5'><style id='rvVNkTpR8ytr4j5'></style></address><button id='rvVNkTpR8ytr4j5'></button>

                      <kbd id='rvVNkTpR8ytr4j5'></kbd><address id='rvVNkTpR8ytr4j5'><style id='rvVNkTpR8ytr4j5'></style></address><button id='rvVNkTpR8ytr4j5'></button>

                              <kbd id='rvVNkTpR8ytr4j5'></kbd><address id='rvVNkTpR8ytr4j5'><style id='rvVNkTpR8ytr4j5'></style></address><button id='rvVNkTpR8ytr4j5'></button>

                                  申博娱乐官网_FFmpeg代码导读系列:HEVC在RTMP中的扩展

                                  作者:申博娱乐官网  发布时间:2018-02-02 18:58  阅读:8183

                                  跟着直播、短视频的一连火爆和产物成果的不绝进级,音视频开拓职员也面对着诸多的机会与挑衅。譬喻,在视频流媒体的传输进程中,视频数据的传输占有了绝大部门带宽,怎样晋升编码服从,占用更少带宽,提供更优质的画面质量,就成为了音视频开拓职员全力的方针。HEVC(High Efficiency Video Coding,即H.265)编码名目标推出,为这一题目带来了办理的思绪,但因为其算法伟大度较高,因此前期并未广泛应用,而跟着移动装备计较手段的晋升以及越来越多的装备对HEVC硬件编/解码的支持,直播平台也逐渐引入了HEVC这一视频名目。

                                  HEVC属于视频编码尺度,假如应用在视频流媒体中,必要响应的封装名目和流媒体协议的支持。鉴于直播的大部门推拉流协议基于RTMP(real time messaging protocol,及时动静传送协议,是Adobe Systems公司为Flash播放器和处事器之间音频、视频和数据传输开拓的私有协议),本文以金山云今朝的做法为例,首要先容如安在RTMP协议中增进对HEVC视频编码名目标支持。

                                  直播框架理会

                                  典范的直播框架凡是包罗三大部门,如下图所示:

                                  1.推流端:认真音视频数据的收罗、处理赏罚、编码及封装后将数据推送至源站;

                                  2.处事端:涵盖源站和CDN,吸取来自推流端的音视频数据,然后将数据分发至各播放端;

                                  3.播放端:从CDN拉取直播数据,解复用、解码后渲染音视频数据;

                                  FFmpeg代码导读系列:HEVC在RTMP中的扩展

                                  直播框架图

                                  引入HEVC编码,涉及到的变换部门,上图中的赤色字体已标注:

                                  1.编码模块:必要支持HEVC名目标编解码,该部门不属于本文的先容领域,可自行查阅;

                                  2.封装/传输模块:RTMP、HTTP-FLV流媒体协议必要增进对HEVC视频编码名目标支持,这一部门是本文先容的重点。

                                  宽大音视频开拓者对付FFmpeg并不生疏,因为它有着能在多媒体处理赏罚上提供强盛成果、开源易于修改维护的特征,使得其被普及应用于种种音视频软件中。因为Adobe停息了对RTMP/FLV尺度的更新,以是今朝尺度中没有支持HEVC视频编码名目。为停止各终端和处事器间的兼容性题目,FFmpeg也没有在RTMP/FLV的协议实现中举办HEVC的相干展。CDN同盟拟定了相干的协议展类型,并在FFmpeg中完成了相干代码实现。

                                  FFmpeg简析

                                  开源措施FFmpeg成长至今,成果日益强盛,许多初学者都被其浩瀚的源文件、复杂的布局体和伟大的算法撤销了继承进修的动机。我们先从总体上对FFmpeg举办理会。

                                  FFmpeg包括如下类库:

                                  libavformat - 用于各类音视频封装名目标天生息争析,包罗获取解码所需信息、读取音视频数据等成果。各类流媒体协议代码(如rtmpproto.c等)以及音视频名目标(解)复用代码(如flvdec.c、flvenc.c等)都位于该目次下。

                                  libavcodec - 音视频各类名目标编解码。各类名目标编解码代码(如aacenc.c、aacdec.c等)都位于该目次下。

                                  libavutil - 包括一些民众的器材函数的行使库,包罗算数运算,字符操纵等。

                                  libswscale - 提供原始视频的比例缩放、色彩映射转换、图像颜色空间或名目转换的成果。

                                  libswresample - 提供音频重采样,采样名目转换和殽杂等成果。

                                  libavfilter - 各类音视频滤波器。

                                  libpostproc - 用于后期结果处理赏罚,如图像的去块效应等。

                                  libavdevice - 用于硬件的音视频收罗、加快和表现。

                                  假如之前没有阅读FFmpeg代码的履历,提议优先阅读libavformat、libavcodec以及libavutil下面的代码,它们提供了音视频开拓的根基成果,应用范畴也最广。

                                  常用布局

                                  FFmpeg内里最常用的数据布局,按成果可大抵分为以下几类(以下代码行数,以branch: origin/release/3.4为准):

                                  1.封装名目

                                  AVFormatContext - 描写了媒体文件的组成及根基信息,是管辖全局的根基布局体,贯串措施始终,许多函数都要用它作为参数;

                                  AVInputFormat - 解复用器工具,每种作为输入的封装名目(譬喻FLV、MP4、TS等)对应一个该布局体,如libavformat/flvdec.c的ff_flv_demuxer;

                                  AVOutputFormat - 复用器工具,每种作为输出的封装名目(譬喻FLV, MP4、TS等)对应一个该布局体,如libavformat/flvenc.c的ff_flv_muxer;

                                  AVStream - 用于描写一个视频/音频流的相干数据信息。

                                  2.编解码

                                  AVCodecContext - 描写编解码器上下文的数据布局,包括了浩瀚编解码器必要的参数信息;

                                  AVCodec - 编解码器工具,每种编解码名目(譬喻H.264、AAC等)对应一个该布局体,如libavcodec/aacdec.c的ff_aac_decoder。每个AVCodecContext中含有一个AVCodec;

                                  AVCodecParameters - 编解码参数,每个AVStream中都含有一个AVCodecParameters,用来存放当前流的编解码参数。

                                  3.收集协议

                                  AVIOContext - 打点输入输出数据的布局体;

                                  URLProtocol - 描写了音视频数据传输所行使的协议,每种传输协议(譬喻HTTP、RTMP)等,城市对应一个URLProtocol布局,如libavformat/http.c中的ff_http_protocol;

                                  URLContext - 封装了协议工具及协议操纵工具。

                                  4.数据存放

                                  AVPacket - 存放编码后、解码前的压缩数据,即ES数据;

                                  AVFrame - 存放编码前、解码后的原始数据,如YUV名目标视频数据或PCM名目标音频数据等;

                                  上述布局体的相关图如下所示(箭头暗示派生出):

                                  FFmpeg代码导读系列:HEVC在RTMP中的扩展

                                  FFmpeg布局体相关图

                                  代码布局

                                  下面这段代码完成了读取媒体文件中音视频数据的根基成果,本节以此为例,说明FFmpeg内部代码的挪用逻辑。

                                  const char *url = "http://192.168.1.105/test.flv";

                                  AVPacket pkt;

                                  int ret = 0;

                                  //注册复用器、编码器等

                                  av_register_all();

                                  avformat_network_init();

                                  //打开文件

                                  AVFormatContext *fmtCtx = avformat_alloc_context();

                                  ret = avformat_open_input(&fmtCtx, url, NULL, NULL);

                                  ret = avformat_find_stream_info(fmtCtx, NULL);

                                  //读取音视频数据

                                  while(ret >= 0)

                                  {

                                  ret = av_read_frame(s, &pkt);

                                  }

                                  1.注册

                                  av_register_all函数的浸染是注册一系列的(解)复用器、编/解码器等。它在全部基于FFmpeg的应用措施中险些都是第一个被挪用的,只有挪用了该函数,才气行使复用器、编码器等。

                                  static void register_all(void)

                                  {

                                  avcodec_register_all();

                                  /* (de)muxers */

                                  ……

                                  REGISTER_MUXDEMUX(FLV, flv);

                                  ……

                                  }

                                  REGISTER_MUXDEMUX现实上挪用的是av_register_input_format和av_register_output_format,通过这两个要领,将(解)复用器别离添加到了全局变量first_iformat与first_oformat链表的最后位置。

                                  编/解码其注册进程沟通,此处不再赘述。

                                  2.文件打开