哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

文 / 施雪梅

4. HEVC在RTMP中的擴(kuò)展

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

4.1 FLV規(guī)范擴(kuò)展

HEVC為視頻編碼格式,因此對(duì)FLV規(guī)范的擴(kuò)展,只集中在Video Tag,其它部分,無任何改動(dòng)。

4.1.1 支持HEVC的VideoTagHeader

擴(kuò)展后的VideoTagHeader如下圖所示(紅色字體為新增內(nèi)容):

圖9. 支持HEVC的FLVTagHeader

修改點(diǎn)如下:

1.CodecID - 定義HEVC格式的值為12;

2.HEVCPacketType - 當(dāng)CodecID == 12時(shí),AVCPacketType為HEVCPacketType:

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

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

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

3.CompositionTime - 當(dāng)CodecID == 12時(shí),同樣需要CompositionTime。

4.1.2 支持HEVC的VideoTagBody

當(dāng)CodecID為12時(shí),VideoTagBody中存放的就是HEVC視頻幀內(nèi)容。

擴(kuò)展后的VideoTagBody如下圖所示(紅色字體為HEVC新增內(nèi)容):

圖10. 支持HEVC的VideoTagBody

4.2 FFmpeg中的修改

我們已在FFmpeg的各個(gè)版本上提供相關(guān)的完整修改,具體參見:https://github.com/ksvc/FFmpeg,完整patch獲取及相關(guān)說明見:https://github.com/ksvc/FFmpeg/wiki。

由第二章節(jié)的闡述可知,F(xiàn)LV的解復(fù)用和復(fù)用功能代碼分別在libavformt/flvdec.c和libavformat/flvenc.c中,擴(kuò)展后的修改也都集中在這兩個(gè)文件。本節(jié)將在FFmpeg3.3的基礎(chǔ)上,說明修改的關(guān)鍵點(diǎn)。

4.2.1 編碼類型定義

libavformat/flv.h中按照VideoTagHeader中的CodecID定義了一組視頻編碼格式的枚舉值,擴(kuò)展后的枚舉定義如下:


	

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

在解復(fù)用過程中,flv_read_packet方法是整個(gè)過程的核心,它里面完成了對(duì)每個(gè)Tag的讀取和解析。

4.1.1中提到,如果HEVCPacketType為0時(shí),表示HEVCVIDEOPACKET中存放的是HEVC sequence header,也就是HEVCDecoderConfigurationRecord,解碼時(shí)需設(shè)置HEVCDecoderConfigurationRecord方能正確解碼。

HEVC與AVC視頻幀在FLV中的存放格式相同,所以只需在讀取Video Tag的地方增加AV_CODEC_ID_HEVC的判斷條件即可,調(diào)整后的代碼如下:


	

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的修改相對(duì)較多、header、packet、trailer中均有涉及。

4.2.3.1 write header

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

  1. 寫入FLV Header;

  2. 寫入Metadata;

  3. 如果音頻編碼格式為AAC,則寫入第一個(gè)Audio Tag,其AudioTagBody中存放的是AAC sequence header;

  4. 如果視頻編碼格式為AVC,則寫入第一個(gè)Video Tag,其中VideoTagBody中存放的是AVC sequence header。

同樣,當(dāng)視頻編碼格式HEVC時(shí),也要寫入第一個(gè)VideoTag,其中VideoTagBody中存放的是HEVCDecoderConfigurationRecord,修改點(diǎn)如下:


	

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轉(zhuǎn)為HEVCDecoderConfigurationRecord結(jié)構(gòu)并寫入。

4.2.3.2 write packet

flv_write_packet的作用是寫入音視頻幀,其中有關(guān)寫入video數(shù)據(jù)的地方,都需要加上AV_CODEC_ID_HEVC的判斷條件,修改內(nèi)容如下:


	

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視頻幀轉(zhuǎn)為HVCC格式。

AnnexB與AVCC/HVCC(ISO/IEC14496-15中所定義,通常也稱為MPEG-4格式)的區(qū)別在于參數(shù)集與幀格式,AnnexB的參數(shù)集sps、pps以NAL的形式存在碼流中(帶內(nèi)傳輸),以startcode分割NAL。而HVCC 的參數(shù)集存儲(chǔ)在extradata中(帶外傳輸),使用NALU長(zhǎng)度(固定字節(jié),通常為4字節(jié),從extradata中解析)分隔NAL。

4.2.3.3 write trailer

結(jié)束時(shí)需要寫入HEVC end of sequence,其格式與AVC end of sequence相同,直接復(fù)用即可,flv_write_trailer的修改內(nèi)容如下:


	

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. 結(jié)束語(yǔ)

本文簡(jiǎn)單介紹了如何在FFmpeg中擴(kuò)展rtmp協(xié)議對(duì)HEVC編碼格式的支持,而要將HEVC應(yīng)用于直播整體方案,除推流端和播放端要提供相應(yīng)能力外,源站、CDN、轉(zhuǎn)碼服務(wù)同樣都需要提供這種能力。金山云的所有視頻服務(wù)中,已完全支持HEVC視頻編碼格式,歡迎大家使用。

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

    關(guān)注

    5208

    文章

    20620

    瀏覽量

    336695
  • 視頻編碼
    +關(guān)注

    關(guān)注

    2

    文章

    115

    瀏覽量

    21619
  • 視頻流
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    10605

原文標(biāo)題:FFmpeg代碼導(dǎo)讀——HEVC在RTMP中的擴(kuò)展

文章出處:【微信號(hào):livevideostack,微信公眾號(hào):LiveVideoStack】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ADV7390/ADV7391/ADV7392/ADV7393:低功耗視頻編碼器的卓越之選

    ADV7390/ADV7391/ADV7392/ADV7393:低功耗視頻編碼器的卓越之選 在如今的電子設(shè)備,視頻處理能力至關(guān)重要。ADV7390/ADV7391/ADV7392/A
    的頭像 發(fā)表于 04-18 16:45 ?583次閱讀

    ADV7342/ADV7343:高性能多格式視頻編碼器的技術(shù)剖析

    ADV7342/ADV7343:高性能多格式視頻編碼器的技術(shù)剖析 一、引言 在當(dāng)今的視頻處理領(lǐng)域,高性能的視頻
    的頭像 發(fā)表于 04-18 16:25 ?161次閱讀

    ADV7340/ADV7341:高性能多格式視頻編碼器的技術(shù)解析

    ADV7340/ADV7341:高性能多格式視頻編碼器的技術(shù)解析 在當(dāng)今數(shù)字化的時(shí)代,視頻處理技術(shù)不斷發(fā)展,對(duì)于高質(zhì)量、多格式
    的頭像 發(fā)表于 04-18 16:20 ?151次閱讀

    ADV7184:多格式SDTV視頻解碼器的卓越之選

    ADV7184:多格式SDTV視頻解碼器的卓越之選 在當(dāng)今數(shù)字化的時(shí)代,視頻解碼技術(shù)在眾多領(lǐng)域都發(fā)揮著至關(guān)重要的作用。ADV7184作為一款高性能的多格式SDTV
    的頭像 發(fā)表于 04-18 15:40 ?169次閱讀

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

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

    基于FFmpeg解封裝WMV和M4V格式

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

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

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

    HT1001K光電一體機(jī)詳細(xì)介紹和說明

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

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

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

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

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

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

    延遲+穩(wěn)定推流。推流端負(fù)責(zé)將視頻數(shù)據(jù)通過RTMP流媒體協(xié)議傳輸給RTMP流媒體服務(wù)器;拉流端從流媒體服務(wù)器通過
    的頭像 發(fā)表于 12-11 17:17 ?1191次閱讀
    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,當(dāng)前支持的字符集編碼如下 由于移植的工程,之前的文件編碼格式為gb2312的,因此在此ide
    發(fā)表于 09-29 07:41

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

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

    LVDS轉(zhuǎn)USB3.0視頻采集模塊編碼控制板

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

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

    :用于串行通信,適合于多個(gè)從設(shè)備與一個(gè)主設(shè)備的通信。 ModbusTCP/IP:基于以太網(wǎng)的Modbus協(xié)議,適用于工業(yè)網(wǎng)絡(luò)的設(shè)備通信。 ModbusASCII:一種文本格式的Modbus協(xié)
    的頭像 發(fā)表于 06-08 10:10 ?2236次閱讀
    荣成市| 云梦县| 延庆县| 建瓯市| 万宁市| 观塘区| 旅游| 沂源县| 黄石市| 沙洋县| 县级市| 巴里| 高雄县| 孟村| 滦平县| 孟村| 个旧市| 泸州市| 平顶山市| 绿春县| 湛江市| 祁东县| 增城市| 齐齐哈尔市| 蒙山县| 安徽省| 平谷区| 施秉县| 贵溪市| 丰镇市| 白朗县| 孝昌县| 锡林郭勒盟| 宜兰县| 怀化市| 金坛市| 五家渠市| 六枝特区| 西峡县| 山西省| 通山县|