0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在RTMP协议中增加对HEVC视频编码格式的支持

LiveVideoStack 来源:互联网 作者:佚名 2018-01-23 09:36 次阅读

视频流媒体中视频数据的传输占据了绝大部分的带宽,如何提升编码效率、减小带宽使用、提升画面质量,成为音视频开发者努力的重点。HEVC编码格式的推出为此带来了突破点。对于直播而言,大部分推拉流协议是基于RTMP的,因此本文将主要介绍如何在RTMP协议中增加对HEVC视频编码格式的支持。

本文来自金山云OBG事业部投稿,是《FFmpeg从入门到出家》系列的第一篇下半部分,由LiveVideoStack审校整理,希望能让大家对FFmpeg有更深入了解。阅读上半部分内容请点击【阅读原文】

文 / 施雪梅

4. HEVC在RTMP中的扩展

为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具体修改内容见下。

4.1 FLV规范扩展

HEVC为视频编码格式,因此对FLV规范的扩展,只集中在Video Tag,其它部分,无任何改动。

4.1.1 支持HEVC的VideoTagHeader

扩展后的VideoTagHeader如下图所示(红色字体为新增内容):

图9. 支持HEVC的FLVTagHeader

修改点如下:

1.CodecID - 定义HEVC格式的值为12;

2.HEVCPacketType - 当CodecID == 12时,AVCPacketType为HEVCPacketType:

  • 如果HEVCPacketType为0,表示HEVCVIDEOPACKET中存放的是HEVC sequence header;

  • 如果HEVCPacketType为1,表示HEVCVIDEOPACKET中存放的是HEVC NALU;

  • 如果HEVCPacketType为2,表示HEVCVIDEPACKET中存放的是HEVC end of sequence,即HEVCDecoderConfigurationRecord;

3.CompositionTime - 当CodecID == 12时,同样需要CompositionTime。

4.1.2 支持HEVC的VideoTagBody

当CodecID为12时,VideoTagBody中存放的就是HEVC视频帧内容。

扩展后的VideoTagBody如下图所示(红色字体为HEVC新增内容):

图10. 支持HEVC的VideoTagBody

4.2 FFmpeg中的修改

我们已在FFmpeg的各个版本上提供相关的完整修改,具体参见:https://github.com/ksvc/FFmpeg,完整patch获取及相关说明见:https://github.com/ksvc/FFmpeg/wiki。

由第二章节的阐述可知,FLV的解复用和复用功能代码分别在libavformt/flvdec.c和libavformat/flvenc.c中,扩展后的修改也都集中在这两个文件。本节将在FFmpeg3.3的基础上,说明修改的关键点。

4.2.1 编码类型定义

libavformat/flv.h中按照VideoTagHeader中的CodecID定义了一组视频编码格式的枚举值,扩展后的枚举定义如下:


	

enum { FLV_CODECID_H263 = 2, FLV_CODECID_SCREEN = 3, FLV_CODECID_VP6 = 4, FLV_CODECID_VP6A = 5, FLV_CODECID_SCREEN2 = 6, FLV_CODECID_H264 = 7, FLV_CODECID_REALH263= 8, FLV_CODECID_MPEG4 = 9, FLV_CODECID_HEVC = 12,};

4.2.2 FLV demux

在解复用过程中,flv_read_packet方法是整个过程的核心,它里面完成了对每个Tag的读取和解析。

4.1.1中提到,如果HEVCPacketType为0时,表示HEVCVIDEOPACKET中存放的是HEVC sequence header,也就是HEVCDecoderConfigurationRecord,解码时需设置HEVCDecoderConfigurationRecord方能正确解码。

HEVC与AVC视频帧在FLV中的存放格式相同,所以只需在读取Video Tag的地方增加AV_CODEC_ID_HEVC的判断条件即可,调整后的代码如下:


	

if (st->codecpar->codec_id == AV_CODEC_ID_AAC || st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC || st->codecpar->codec_id == AV_CODEC_ID_MPEG4) { int type = avio_r8(s->pb); size--; if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC || st->codecpar->codec_id == AV_CODEC_ID_MPEG4) { // sign extension int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; pts = dts + cts; if (cts< 0) { // dts might be wrong if (!flv->wrong_dts) av_log(s, AV_LOG_WARNING, "Negative cts, previous timestamps might be wrong.\n"); flv->wrong_dts = 1; } else if (FFABS(dts - pts) > 1000*60*15) { av_log(s, AV_LOG_WARNING, "invalid timestamps %"PRId64" %"PRId64"\n", dts, pts); dts = pts = AV_NOPTS_VALUE; } } if (type == 0 &&(!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC || st->codecpar->codec_id == AV_CODEC_ID_HEVC || st->codecpar->codec_id == AV_CODEC_ID_H264)) { AVDictionaryEntry *t; if (st->codecpar->extradata) { if ((ret = flv_queue_extradata(flv, s->pb, stream_type, size)) < 0) return ret; ret = FFERROR_REDO; goto leave; } if ((ret = flv_get_extradata(s, st, size)) < 0) return ret; …… }}

AVCDecoderConfigurationRecord和HEVCDecoderConfigurationRecord都是存放在AVStream->AVCodecParameter->extradata中。

4.2.3 FLV mux

FLV mux的修改相对较多、header、packet、trailer中均有涉及。

4.2.3.1 write header

flv_write_header中主要完成了以下工作:

  1. 写入FLV Header;

  2. 写入Metadata;

  3. 如果音频编码格式为AAC,则写入第一个Audio Tag,其AudioTagBody中存放的是AAC sequence header;

  4. 如果视频编码格式为AVC,则写入第一个Video Tag,其中VideoTagBody中存放的是AVC sequence header。

同样,当视频编码格式HEVC时,也要写入第一个VideoTag,其中VideoTagBody中存放的是HEVCDecoderConfigurationRecord,修改点如下:


	

avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flagsavio_w8(pb, 0); // AVC sequence headeravio_wb24(pb, 0); // composition timeif (par->codec_id == AV_CODEC_ID_HEVC) ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0);else ff_isom_write_avcc(pb, par->extradata, par->extradata_size);

ff_isom_write_hvcc的作用是将extradata转为HEVCDecoderConfigurationRecord结构并写入。

4.2.3.2 write packet

flv_write_packet的作用是写入音视频帧,其中有关写入video数据的地方,都需要加上AV_CODEC_ID_HEVC的判断条件,修改内容如下:


	

else if (par->codec_id == AV_CODEC_ID_HEVC ){ if (par->extradata_size> 0 && *(uint8_t*)par->extradata != 1) if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0) return ret; }

ff_hevc_annexb2mp4_buf方法的作用是将Annex-B格式的HEVC视频帧转为HVCC格式。

AnnexB与AVCC/HVCC(ISO/IEC14496-15中所定义,通常也称为MPEG-4格式)的区别在于参数集与帧格式,AnnexB的参数集sps、pps以NAL的形式存在码流中(带内传输),以startcode分割NAL。而HVCC 的参数集存储在extradata中(带外传输),使用NALU长度(固定字节,通常为4字节,从extradata中解析)分隔NAL。

4.2.3.3 write trailer

结束时需要写入HEVC end of sequence,其格式与AVC end of sequence相同,直接复用即可,flv_write_trailer的修改内容如下:


	

if (par->codec_type == AVMEDIA_TYPE_VIDEO && (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_MPEG4)) put_avc_eos_tag(pb, sc->last_ts); 

5. 结束语

本文简单介绍了如何在FFmpeg中扩展rtmp协议对HEVC编码格式的支持,而要将HEVC应用于直播整体方案,除推流端和播放端要提供相应能力外,源站、CDN、转码服务同样都需要提供这种能力。金山云的所有视频服务中,已完全支持HEVC视频编码格式,欢迎大家使用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19123

    浏览量

    305151
  • 视频编码
    +关注

    关注

    2

    文章

    113

    浏览量

    21023
  • 视频流
    +关注

    关注

    0

    文章

    17

    浏览量

    10330

原文标题:FFmpeg代码导读——HEVC在RTMP中的扩展

文章出处:【微信号:livevideostack,微信公众号:LiveVideoStack】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何在播放视频过程插入音频

    ZDP14x0是一款基于开源GUI引擎的图像显示专用驱动芯片,可以通过串口或者SPI与其他芯片通信,且能播放视频。本文将介绍如何在播放视频过程插入音频。
    的头像 发表于 12-26 11:13 94次阅读
    如<b class='flag-5'>何在</b>播放<b class='flag-5'>视频</b>过程<b class='flag-5'>中</b>插入音频

    MOV文件与其他视频格式的兼容性

    高画质 :MOV格式支持高分辨率和高帧率,能够提供清晰细腻的画面。 多种编解码器支持 :MOV格式支持多种编解码器,如H.264、MPEG
    的头像 发表于 12-06 14:36 344次阅读

    在米尔电子MPSOC实现12G SDI视频采集H.265压缩SGMII万兆以太网推流

    。4.H.265视频压缩:使用Zynq UltraScale+ VCU IP核对存储的RGB视频帧进行H.265编码压缩。VCU支持YUV420格式
    发表于 11-01 16:56

    4K视频为何越来越糊?SGMII与HEVC如何重拾高码流体验

    视频编码、网络带宽、和视频传输的诸多因素。近期“影视飓风”发布的视频《清晰度不如4年前!视频变糊是你的错觉吗?》因讨论
    的头像 发表于 11-01 08:01 1706次阅读
    4K<b class='flag-5'>视频</b>为何越来越糊?SGMII与<b class='flag-5'>HEVC</b>如何重拾高码流体验

    在米尔电子MPSOC实现12G SDI视频采集H.265压缩SGMII万兆以太网推流

    /HEVC标准,能够实现高达4K UHD分辨率的视频的实时压缩和解压缩。这意味着在广播应用,可以利用VCU进行高效的视频编码,减少存储空间
    发表于 10-14 17:42

    英特尔终止SVT-HEVC开源视频编码器项目,引领技术新方向

    在科技日新月异的8月23日,英特尔公司宣布了一项重要决定:正式停止对其可扩展视频技术(SVT)计划的SVT-HEVC开源视频编码器项目的进
    的头像 发表于 08-23 15:57 328次阅读

    教您在79元ARM平台实现H.265视频解码

    哪些视频编解码 T113-i支持多种视频编解码格式视频编码
    发表于 07-17 10:46

    何在psoc 4200解码RC5协议

    何在 psoc 4200 解码 RC5 协议
    发表于 07-04 07:55

    Radeon Vulkan RADV驱动新增支持H.264/H.265编码

    去年5月,David Airlie提出并实现了H.264 / H.265 Vulkan Video编码补丁集,现已融入Mesa 24.1版本之中。针对此次Git主线合并请求,Airlie简短评论道:“此补丁旨在拓展Vulkan,为RADV驱动增加对vulkan video
    的头像 发表于 04-12 14:59 616次阅读

    高清模拟视频采集与H.264编码⼀体化采集卡LCC261数据手册

    LCC261是灵卡技术研发的⼀款高清模拟视频采集与H.264编码⼀体化的采集卡。输入接口采用BNC接头,支持AHD/TVI/CVI/ CVBS多种格式标准,最高
    发表于 04-12 14:40 0次下载

    定制高清视频转换器:实现无缝视频格式转换的创新解决方案

    随着多媒体内容的日益丰富和多样化,高清视频已成为人们日常生活和工作不可或缺的一部分。然而,不同设备和平台使用的视频格式各不相同,这给视频的分发和共享带来了挑战。为了满足用户对高清
    的头像 发表于 02-22 14:28 321次阅读

    视频更便于传输,智能家居中的HEVC芯片

    电子发烧友网报道(文/黄山明)在智能家居中,视频压缩处理非常关键,视频压缩处理芯片通常采用先进的视频压缩标准,如H.264/AVC或H.265/HEVC。这些标准能够将
    的头像 发表于 02-22 00:17 3455次阅读

    格式支持:无缝高清矩阵切换器的灵活应用

    无缝高清矩阵切换器的多格式支持是其灵活应用的关键之一。通过多格式支持,切换器能够满足不同设备、不同应用场景和不同传输协议的需求,实现
    的头像 发表于 01-24 14:33 406次阅读

    车载播放器怎么选择格式

    :MP3是目前最常见和广泛支持的音频格式之一。它可以提供良好的音质,并且具有较小的文件大小。由于大多数音乐都是以MP3格式存储在设备的,所以选择
    的头像 发表于 01-05 16:36 1733次阅读

    Enhanced-RTMP协议如何支持H.265呢?

    准确的说,RTMP是传输协议,传输协议内部的封装是flv格式,其实我们所说的支持H.265,是在flv封装
    的头像 发表于 01-03 09:15 1193次阅读