91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在RTMP協(xié)議中增加對HEVC視頻編碼格式的支持

LiveVideoStack ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-01-23 09:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

視頻流媒體中視頻數(shù)據(jù)的傳輸占據(jù)了絕大部分的帶寬,如何提升編碼效率、減小帶寬使用、提升畫面質量,成為音視頻開發(fā)者努力的重點。HEVC編碼格式的推出為此帶來了突破點。對于直播而言,大部分推拉流協(xié)議是基于RTMP的,因此本文將主要介紹如何在RTMP協(xié)議中增加對HEVC視頻編碼格式的支持。

本文來自金山云OBG事業(yè)部投稿,是《FFmpeg從入門到出家》系列的第一篇下半部分,由LiveVideoStack審校整理,希望能讓大家對FFmpeg有更深入了解。閱讀上半部分內容請點擊【閱讀原文】

文 / 施雪梅

4. HEVC在RTMP中的擴展

為推進HEVC視頻編碼格式在直播方案中的落地,經(jīng)過CDN聯(lián)盟討論,并和主流云服務廠商達成一致,規(guī)范了HEVC在RTMP/FLV中的擴展,具體修改內容見下。

4.1 FLV規(guī)范擴展

HEVC為視頻編碼格式,因此對FLV規(guī)范的擴展,只集中在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。

由第二章節(jié)的闡述可知,F(xiàn)LV的解復用和復用功能代碼分別在libavformt/flvdec.c和libavformat/flvenc.c中,擴展后的修改也都集中在這兩個文件。本節(jié)將在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數(shù)據(jù)的地方,都需要加上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格式)的區(qū)別在于參數(shù)集與幀格式,AnnexB的參數(shù)集sps、pps以NAL的形式存在碼流中(帶內傳輸),以startcode分割NAL。而HVCC 的參數(shù)集存儲在extradata中(帶外傳輸),使用NALU長度(固定字節(jié),通常為4字節(jié),從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協(xié)議對HEVC編碼格式的支持,而要將HEVC應用于直播整體方案,除推流端和播放端要提供相應能力外,源站、CDN、轉碼服務同樣都需要提供這種能力。金山云的所有視頻服務中,已完全支持HEVC視頻編碼格式,歡迎大家使用。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5198

    文章

    20435

    瀏覽量

    333894
  • 視頻編碼
    +關注

    關注

    2

    文章

    114

    瀏覽量

    21596
  • 視頻流
    +關注

    關注

    0

    文章

    18

    瀏覽量

    10593

原文標題:FFmpeg代碼導讀——HEVC在RTMP中的擴展

文章出處:【微信號:livevideostack,微信公眾號:LiveVideoStack】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    LMH1981多格式視頻同步分離器:高性能視頻應用的理想之選

    LMH1981多格式視頻同步分離器:高性能視頻應用的理想之選 在當今的視頻技術領域,對于高質量同步分離的需求日益增長。德州儀器(TI)的LMH1981多
    的頭像 發(fā)表于 02-10 09:25 ?469次閱讀

    基于FFmpeg解封裝WMV和M4V格式

    開源鴻蒙具備多格式視頻播放能力,其播放器需依次完成解協(xié)議、解封裝、解碼、渲染四大核心步驟,方可將音視頻內容完整呈現(xiàn)給用戶;其中,解封裝作為銜接協(xié)議
    的頭像 發(fā)表于 01-21 12:57 ?337次閱讀

    OPPO 作為被許可方加入 VVC Advance 專利池并續(xù)簽 HEVC Advance 許可

    。 OPPO 是全球最大的智能手機制造商之一,業(yè)務遍及 70 多個國家,自 2020 年以來一直是 HEVC Advance專利池的重要參與者,2025年也作為許可方加入了 Advance的視頻分發(fā)專利
    的頭像 發(fā)表于 01-09 15:56 ?669次閱讀

    HT1001K光電一體機詳細介紹和說明

    運行,適配工業(yè)級與商業(yè)級不間斷工作需求。 (二)音視頻處理能力 ? 視頻編碼技術:支持H.264、H.265兩種標準編碼
    發(fā)表于 01-06 18:24

    光纖20公里,網(wǎng)線250米,HT1001EK長距離傳輸無憂

    HDMI 1.4標準與HDCP 1.3高帶寬數(shù)字內容保護技術,支持RTSP/RTP/RTCP/RTMP等主流網(wǎng)絡協(xié)議,可實現(xiàn)7×24小時不間斷穩(wěn)定運行,廣泛適配網(wǎng)絡直播、安防監(jiān)控、視頻
    發(fā)表于 01-05 19:09

    HT1001EK音視頻編碼器——高清傳輸.穩(wěn)定無憂,全場景音視頻解決方案

    輸入輸出 ? 協(xié)議RTMP/RTSP,支持推流拉流 ? 接口:HDMI/光纖/網(wǎng)口/RS232,全能適配 1. 針對直播機構/傳媒團隊 “您做網(wǎng)絡直播最擔心高清信號卡頓、推流延時吧?咱們
    發(fā)表于 12-30 15:26

    RK3576輕松搭建RTMP視頻推流,基于FFmpeg+Nginx協(xié)同

    延遲+穩(wěn)定推流。推流端負責將視頻數(shù)據(jù)通過RTMP流媒體協(xié)議傳輸給RTMP流媒體服務器;拉流端從流媒體服務器通過
    的頭像 發(fā)表于 12-11 17:17 ?899次閱讀
    RK3576輕松搭建<b class='flag-5'>RTMP</b><b class='flag-5'>視頻</b>推流,基于FFmpeg+Nginx協(xié)同

    如何給rt-thread studio 2.2.8 ide工具安裝支持其他字符編碼,如gb2312等?

    目前使用的rt-thread studio版本為2.2.8,當前支持的字符集編碼如下 由于移植的工程,之前的文件編碼格式為gb2312的,因此在此ide
    發(fā)表于 09-29 07:41

    ?LMH1981多格式視頻同步分離器技術文檔總結

    三電平同步,輸出提供CMOS邏輯的所有關鍵定時信號,其中 從軌道到軌道的擺動 (V~CC~和 GND),包括復合、水平和 垂直同步、連拍/后廊定時、奇數(shù)/偶數(shù)場和視頻格式輸出。HSync 功能 其前緣(下降)沿的抖動非常低,最大限度地減少了清潔和清潔所需的外部電路。
    的頭像 發(fā)表于 09-19 10:18 ?945次閱讀
    ?LMH1981多<b class='flag-5'>格式</b><b class='flag-5'>視頻</b>同步分離器技術文檔總結

    視耀T1 MINI-4路4K編解碼器丨端到端超低延時賦能4K超清視界

    ,通過FPGA硬件加速與碼控技術,設備極大提升了編碼效率,端到端延時壓縮至300ms以內,滿足廣播級專業(yè)音視頻傳輸應用。其12G-SDI、Quad-Link 3G-SDI、HDMI 2.1多接口設計支持
    發(fā)表于 08-28 13:43

    何在充電樁端支持 OCPP 協(xié)議 —— 網(wǎng)關方案解析

    。對于充電樁運營商和制造商來說,要想實現(xiàn)充電樁出口海外,在充電樁端有效支持OCPP協(xié)議至關重要,而采用深圳惠志科技的OCPP協(xié)議4g網(wǎng)關,往往是實現(xiàn)這一目標的最優(yōu)選擇
    的頭像 發(fā)表于 07-24 09:37 ?8209次閱讀
    如<b class='flag-5'>何在</b>充電樁端<b class='flag-5'>支持</b> OCPP <b class='flag-5'>協(xié)議</b> —— 網(wǎng)關方案解析

    LVDS轉USB3.0視頻采集模塊編碼控制板

    USB3.0視頻采集模塊通過LVDS接口連接機芯,自動識別機芯高清視頻格式。支持720P,1080I,1080P各種幀率,讓SONY FCB一體化攝像機芯所拍攝圖像即刻顯示在電腦屏幕
    的頭像 發(fā)表于 07-09 10:22 ?839次閱讀
    LVDS轉USB3.0<b class='flag-5'>視頻</b>采集模塊<b class='flag-5'>編碼</b>控制板

    工業(yè)數(shù)據(jù)采集網(wǎng)關支持哪些工業(yè)協(xié)議?

    :用于串行通信,適合于多個從設備與一個主設備的通信。 ModbusTCP/IP:基于以太網(wǎng)的Modbus協(xié)議,適用于工業(yè)網(wǎng)絡的設備通信。 ModbusASCII:一種文本格式的Modbus協(xié)
    的頭像 發(fā)表于 06-08 10:10 ?2086次閱讀

    GM7121-D視頻編碼芯片技術解析與應用指南

    信號處理、色差內插濾波、行場同步控制及PAL制式編碼輸出,適用于安防監(jiān)控、醫(yī)療成像設備、工業(yè)視覺等領域。 ? --- #### 二、關鍵特性 ? 1. **視頻處理能力** ? ? - 支持亮度/色差信號分離處理,內置6.75M
    的頭像 發(fā)表于 04-23 15:27 ?1024次閱讀

    英飛凌邊緣AI平臺通過Ultralytics YOLO模型增加對計算機視覺的支持

    【2025年3月7日, 德國慕尼黑訊】全球功率系統(tǒng)、汽車和物聯(lián)網(wǎng)領域的半導體領導者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)在DEEPCRAFT Studio增加
    的頭像 發(fā)表于 03-11 15:11 ?811次閱讀
    英飛凌邊緣AI平臺通過Ultralytics YOLO模型<b class='flag-5'>增加對</b>計算機視覺的<b class='flag-5'>支持</b>