一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

文 / 施雪梅

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為視頻編碼格式,因此對FLV規(guī)范的擴(kuò)展,只集中在Video Tag,其它部分,無任何改動。

4.1.1 支持HEVC的VideoTagHeader

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

圖9. 支持HEVC的FLVTagHeader

修改點如下:

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

2.HEVCPacketType - 當(dāng)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 - 當(dāng)CodecID == 12時,同樣需要CompositionTime。

4.1.2 支持HEVC的VideoTagBody

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

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

圖10. 支持HEVC的VideoTagBody

4.2 FFmpeg中的修改

我們已在FFmpeg的各個版本上提供相關(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ò)展后的修改也都集中在這兩個文件。本節(jié)將在FFmpeg3.3的基礎(chǔ)上,說明修改的關(guā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方法是整個過程的核心,它里面完成了對每個Tag的讀取和解析。

4.1.1中提到,如果HEVCPacketType為0時,表示HEVCVIDEOPACKET中存放的是HEVC sequence header,也就是HEVCDecoderConfigurationRecord,解碼時需設(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的修改相對較多、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。

同樣,當(dāng)視頻編碼格式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轉(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ù)集存儲在extradata中(帶外傳輸),使用NALU長度(固定字節(jié),通常為4字節(jié),從extradata中解析)分隔NAL。

4.2.3.3 write trailer

結(jié)束時需要寫入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é)束語

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

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

    關(guān)注

    5152

    文章

    19675

    瀏覽量

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

    關(guān)注

    2

    文章

    114

    瀏覽量

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

    關(guān)注

    0

    文章

    17

    瀏覽量

    10467

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

    請問tvp5150a支持EIA/CCIR格式嗎?

    的話,Ti有沒有支持格式視頻解碼的芯片功能性能跟5150差不多的。 我試驗連接連接相機(jī)到采集電路上試了一下,確實踩不出圖像,但不知是不是5150寄存器設(shè)置的問題,還是5150就是不
    發(fā)表于 02-08 08:08

    何在Windows中使用MTP協(xié)議

    、圖片等)的通信協(xié)議,它被廣泛用于Android設(shè)備。以下是如何在Windows中使用MTP協(xié)議的詳細(xì)步驟: 1. 確保設(shè)備支持MTP 首先,你需要確認(rèn)你的設(shè)備
    的頭像 發(fā)表于 01-03 10:26 ?2623次閱讀

    【飛凌嵌入式OK3588J-C開發(fā)板體驗】OK3588J-C開發(fā)板的HDMI輸入轉(zhuǎn)RTMP直播

    在上一篇報告,我們已經(jīng)可以將RTSP轉(zhuǎn)成RTMP進(jìn)行直播了,這次我們要將HDMI輸入也要轉(zhuǎn)成RTMP進(jìn)行直播。 我們需要在上一篇的基礎(chǔ)上再增加一個HDMI直播按鈕。 頭文件 #ifn
    發(fā)表于 12-29 13:59

    何在播放視頻過程插入音頻

    ZDP14x0是一款基于開源GUI引擎的圖像顯示專用驅(qū)動芯片,可以通過串口或者SPI與其他芯片通信,且能播放視頻。本文將介紹如何在播放視頻過程插入音頻。
    的頭像 發(fā)表于 12-26 11:13 ?1103次閱讀
    如<b class='flag-5'>何在</b>播放<b class='flag-5'>視頻</b>過程<b class='flag-5'>中</b>插入音頻

    MOV文件與其他視頻格式的兼容性

    高畫質(zhì) :MOV格式支持高分辨率和高幀率,能夠提供清晰細(xì)膩的畫面。 多種編解碼器支持 :MOV格式支持多種編解碼器,如H.264、MPEG
    的頭像 發(fā)表于 12-06 14:36 ?2665次閱讀

    MOV格式與MP4格式的區(qū)別

    QuickTime影片格式。 用途:主要用于存儲常用數(shù)字媒體類型,如蘋果設(shè)備(iPhone、iPad)上錄制的視頻。此外,它也被眾多多媒體編輯及視頻處理軟件所支持,適合用于高質(zhì)量的
    的頭像 發(fā)表于 12-06 14:34 ?6024次閱讀

    編碼器的作用和應(yīng)用場景 不同類型編碼器的作用

    可以概括為以下幾點: 數(shù)據(jù)壓縮 :減少數(shù)據(jù)的大小,便于存儲和傳輸。 信號轉(zhuǎn)換 :將模擬信號轉(zhuǎn)換為數(shù)字信號,或反之。 格式轉(zhuǎn)換 :將數(shù)據(jù)從一個格式轉(zhuǎn)換為另一個格式,以適應(yīng)不同的系統(tǒng)或設(shè)備。 錯誤檢測和糾正 :在
    的頭像 發(fā)表于 11-24 09:52 ?3531次閱讀

    PCB層數(shù)增加對成本有哪些影響

    PCB層數(shù)增加的成本影響 層數(shù)與成本的關(guān)系 :通常情況下,PCB的層數(shù)越多,其價格也越貴。這是因為層數(shù)的增加會導(dǎo)致生產(chǎn)步驟(如層壓過程)的數(shù)量增加,從而需要更多的時間和資源來完成制造過程。 設(shè)計考慮
    的頭像 發(fā)表于 11-07 09:12 ?798次閱讀

    在米爾電子MPSOC實現(xiàn)12G SDI視頻采集H.265壓縮SGMII萬兆以太網(wǎng)推流

    。4.H.265視頻壓縮:使用Zynq UltraScale+ VCU IP核對存儲的RGB視頻幀進(jìn)行H.265編碼壓縮。VCU支持YUV420格式
    發(fā)表于 11-01 16:56

    4K視頻為何越來越糊?SGMII與HEVC如何重拾高碼流體驗

    視頻編碼、網(wǎng)絡(luò)帶寬、和視頻傳輸?shù)闹T多因素。近期“影視颶風(fēng)”發(fā)布的視頻《清晰度不如4年前!視頻變糊是你的錯覺嗎?》因討論
    的頭像 發(fā)表于 11-01 08:01 ?2685次閱讀
    4K<b class='flag-5'>視頻</b>為何越來越糊?SGMII與<b class='flag-5'>HEVC</b>如何重拾高碼流體驗

    在米爾電子MPSOC實現(xiàn)12G SDI視頻采集H.265壓縮SGMII萬兆以太網(wǎng)推流

    /HEVC標(biāo)準(zhǔn),能夠?qū)崿F(xiàn)高達(dá)4K UHD分辨率的視頻的實時壓縮和解壓縮。這意味著在廣播應(yīng)用,可以利用VCU進(jìn)行高效的視頻編碼,減少存儲空間
    發(fā)表于 10-14 17:42

    英特爾終止SVT-HEVC開源視頻編碼器項目,引領(lǐng)技術(shù)新方向

    在科技日新月異的8月23日,英特爾公司宣布了一項重要決定:正式停止對其可擴(kuò)展視頻技術(shù)(SVT)計劃的SVT-HEVC開源視頻編碼器項目的進(jìn)
    的頭像 發(fā)表于 08-23 15:57 ?689次閱讀