音視頻入門基礎:RTP專題(15)——FFmpeg源碼中,獲取RTP的視頻信息的實現

一、引言

通過FFmpeg命令可以獲取到SDP文件描述的RTP流的視頻壓縮編碼格式、色彩格式(像素格式)、分辨率、幀率信息:

ffmpeg -protocol_whitelist "file,rtp,udp" -i XXX.sdp

本文以H.264為例講述FFmpeg到底是從哪個地方獲取到這些視頻信息的。?

二、視頻壓縮編碼格式

FFmpeg獲取SDP文件描述的RTP流的視頻壓縮編碼格式,是從SDP的“a=rtpmap”這一行獲取的。比如SDP文件中某一行的內容為:

a=rtpmap:96 H264/90000

FFmpeg識別到上述“a=rtpmap”這個<type>后,會把后面的字符串“H.264”提取出來,檢測是否存在相應的音視頻壓縮編碼格式。如果存在,FFmpeg就會判斷該SDP描述的RTP流的視頻壓縮編碼格式為H.264。

具體可以參考:《音視頻入門基礎:RTP專題(5)——FFmpeg源碼中,解析SDP的實現》。

a=rtpmap時,SDP的該行格式為:

a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>],sdp_parse_line函數中會執行下面代碼塊把SDP中描述的音視頻壓縮編碼格式賦值給st->codecpar->codec_id(即AVCodecParameters的codec_id):

else if (av_strstart(p, "rtpmap:", &p) && s->nb_streams > 0) {/* NOTE: rtpmap is only supported AFTER the 'm=' tag */get_word(buf1, sizeof(buf1), &p);payload_type = atoi(buf1);rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];if (rtsp_st->stream_index >= 0) {st = s->streams[rtsp_st->stream_index];sdp_parse_rtpmap(s, st, rtsp_st, payload_type, p);}s1->seen_rtpmap = 1;if (s1->seen_fmtp) {parse_fmtp(s, rt, payload_type, s1->delayed_fmtp);}} 

然后在sdp_parse_line函數外部,通過avcodec_parameters_to_context函數將AVCodecParameters的codec_id賦值給AVCodecContext的codec_id:

int avcodec_parameters_to_context(AVCodecContext *codec,const AVCodecParameters *par)
{
//...codec->codec_id   = par->codec_id;
//...
}

然后在dump_stream_format函數中,通過avcodec_string函數中的語句:codec_name = avcodec_get_name(enc->codec_id) 拿到AVCodecContext的codec_id對應的視頻壓縮編碼格式名稱。最后再在dump_stream_format函數中將視頻壓縮編碼格式打印出來:

void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
{
//...codec_name = avcodec_get_name(enc->codec_id);
//...
}

所以FFmpeg獲取SDP描述的RTP流的視頻壓縮編碼格式,是從SDP的“a=rtpmap”這一行獲取的:

三、視頻壓縮編碼格式的profile

FFmpeg獲取SDP文件描述的RTP流的視頻壓縮編碼格式的profile,是從SDP的“a=fmtp”這一行獲取的。比如SDP文件中某一行的內容為:

a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZgFAFuwFqAgICgAAAAwCAAAAZB4wYzQ==,aOl7LIs=; profile-level-id=64001F

sprop-parameter-sets屬性的'='號之后攜帶以BASE64編碼和逗號分隔的SPS和PPS。FFmpeg首先會把SDP中的SPS信息提取出來,進行BASE64解碼(具體可以參考:《音視頻入門基礎:RTP專題(6)——FFmpeg源碼中,解析SDP中的packetization-mode、profile-level-id和sprop-parameter-sets實現》),然后通過SPS的profile_idc屬性獲取視頻壓縮編碼格式的profile(具體可以參考:《音視頻入門基礎:H.264專題(17)——FFmpeg源碼中,獲取H.264視頻的profile的實現》):

四、視頻的色彩格式

如果SDP文件描述的RTP流的視頻壓縮編碼格式為H.264,FFmpeg獲取其視頻的色彩格式,是通過SPS中的屬性chroma_format_idc獲取到的,具體可以參考:《音視頻入門基礎:H.264專題(13)——FFmpeg源碼中通過SPS屬性獲取視頻色彩格式的實現》:

五、視頻分辨率

如果SDP文件描述的RTP流的視頻壓縮編碼格式為H.264,FFmpeg獲取其視頻分辨率,是通過SPS中的屬性獲取的,具體可以參考:《音視頻入門基礎:H.264專題(12)——FFmpeg源碼中通過SPS屬性計算視頻分辨率的實現》:

?六、視頻碼率

由于SDP中不包含視頻碼率信息,所以無法通過FFmpeg直接獲取到其視頻碼率。與之對應,由于FLV文件的Script Tag中包含視頻碼率信息,所以FFmpeg可以直接打印FLV文件的視頻碼率,具體可以參考:《音視頻入門基礎:FLV專題(24)——FFmpeg源碼中,獲取FLV文件視頻信息的實現》。

七、視頻幀率

如果SDP文件描述的RTP流的視頻壓縮編碼格式為H.264,對其視頻進行編解碼時,FFmpeg源碼內部使用的是通過SPS中的屬性計算得到的視頻幀率(具體可以參考:《音視頻入門基礎:H.264專題(15)——FFmpeg源碼中通過SPS屬性獲取視頻幀率的實現》):

八、可能遇到的問題

比如,獲取RTP流信息時報錯:“Could not find codec parameters for stream 0 (Video: h264, none): unspecified size Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options”。可以參考《FFmpeg獲取RTP流信息時報錯:Could not find codec parameters for stream 0 (Video: h264, none)》解決。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72589.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習---卷積神經網絡

一、卷積尺寸計算公式 二、池化 池化分為最大池化和平均池化 最常用的就是最大池化&#xff0c;可以認為最大池化不需要引入計算&#xff0c;而平均池化需要引出計算&#xff08;計算平均數&#xff09; 每種池化還分為Pooling和AdaptiveAvgPool Pooling(2)就是每2*2個格子…

netty中Future和ChannelHandler

netty中的Future&#xff0c;繼承自 jdk中的Future&#xff0c;&#xff0c; jdk中的Future&#xff0c;很垃圾&#xff0c;只能同步阻塞獲取結果&#xff0c;&#xff0c;&#xff0c; netty中的Future進行了升級&#xff0c;&#xff0c;可以addListener()異步獲取結果&…

java 初學知識點總結

自己總結著玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//類名用大寫字母開頭 } 2.輸入&#xff1a; (1)Scanner:可讀取各種類型&#xff0c;字符串相當于cin>>; Scanner anew Scanner(System.in); Scan…

質量屬性場景描述

為了精確描述軟件系統的質量屬性&#xff0c;通常采用質量屬性場景&#xff08;Quality Attribute Scenario&#xff09;作為描述質量屬性的手段。質量屬性場景是一個具體的質量屬性需求&#xff0c;使利益相關者與系統的交互的簡短陳述。 質量屬性場景是一種用于描述系統如何…

數據可攜帶權的多重價值與實踐思考

文章目錄 前言一、數據可攜帶權的提出與立法二、數據可攜帶權的多重價值1、推動數據要素市場化配置2、促進市場競爭與創新3、強化個人數據權益 三、數據可攜帶權的實踐挑戰1、數據安全與隱私保護面臨風險2、接口差異導致數據遷移成本高昂3、可攜帶的數據范圍尚存爭議 數據可攜帶…

藍橋每日打卡--分考場

#藍橋#JAVA#分考場 題目描述 n個人參加某項特殊考試。 為了公平&#xff0c;要求任何兩個認識的人不能分在同一個考場。 求是少需要分幾個考場才能滿足條件。 輸入描述 輸入格式&#xff1a; 第一行&#xff0c;一個整數n(1≤n≤100)&#xff0c;表示參加考試的人數。 …

RMAN備份bug-審計日志暴漲(select action from gv$session)

問題概述 /oracle 文件系統使用率過大&#xff0c;經過檢查是審計日志過大,/oracle 目錄 197G 審計日志占用70G&#xff0c;每6個小時產生大量審計日志&#xff0c;日志內容全是select action from gv$session &#xff0c;猜測可能跟備份有關&#xff0c; $>df -h /oracle…

在Blender中給SP分紋理組

在Blender中怎么分SP的紋理組/紋理集 其實紋理組就是材質 把同一組的材質分給同一組的模型 導入到sp里面自然就是同一個紋理組 把模型導入SP之后 就自動分好了

Nuxt:Nuxt3框架中onBeforeMount函數 和onBeforeRouteUpdate函數區別介紹 【超詳細!】

提示&#xff1a;在 Nuxt3 中&#xff0c;onBeforeMount 和 onBeforeRouteUpdate 是兩個不同場景下使用的鉤子函數&#xff0c;分別對應 Vue 組件生命周期 和 路由導航守衛。以下是它們的詳細解釋和對比&#xff1a; 文章目錄 一、onBeforeMount&#xff08;Vue 生命周期鉤子&a…

華為 Open Gauss 數據庫在 Spring Boot 中使用 Flyway

db-migration&#xff1a;Flyway、Liquibase 擴展支持達夢&#xff08;DM&#xff09;、南大通用&#xff08;GBase 8s&#xff09;、OpenGauss 等國產數據庫。部分數據庫直接支持 Flowable 工作流。 開源代碼倉庫 Github&#xff1a;https://github.com/mengweijin/db-migrat…

java 查找兩個集合的交集部分數據

利用了Java 8的Stream API&#xff0c;代碼簡潔且效率高 import java.util.stream.Collectors; import java.util.List; import java.util.HashSet; import java.util.Set;public class ListIntersection {public static List<Long> findIntersection(List<Long> …

雙足機器狗開發:Rider - Pi

雙足機器狗開發:Rider - Pi https://github.com/YahboomTechnology/Rider-Pi-Robot 項目介紹 Rider - Pi是一款為開發者、教育工作者和機器人愛好者設計的桌面雙輪腿式機器人,它基于樹莓派CM4核心模塊構建,具備多種先進功能和特點: 硬件特性 核心模塊:采用樹莓派CM4核…

Android12 添加開機鈴聲

系統默認是沒有播放開機鈴聲的功能&#xff0c;MTK有一套自己的開機鈴聲處理邏輯&#xff0c;代碼在/vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation下&#xff0c;但是在10之后MTK就不在維護這部分代碼了。直接使用會有很多編譯報錯&#x…

3.6V-30V寬壓輸入降壓同步IC內置MOS,電流4A/5A/6A,可以滿足汽車應急電源,BMS電池,電池組USB口輸出等儲能應用

今天給大家介紹一下這三款產品&#xff0c;分別是CJ92340,輸入電壓4.5V-30V&#xff0c;輸出可調&#xff0c;電流負載能力可達4A&#xff0c;頻率350KHZ。CJ92350,輸入電壓3.6V-30V&#xff0c;輸出可調&#xff0c;頻率可調&#xff0c;帶載能力達5A。CJ92360,輸入電壓3.6V-3…

代碼隨想錄算法訓練營第35天 | 01背包問題二維、01背包問題一維、416. 分割等和子集

一、01背包問題二維 二維數組&#xff0c;一維為物品&#xff0c;二維為背包重量 import java.util.Scanner;public class Main{public static void main(String[] args){Scanner scanner new Scanner(System.in);int n scanner.nextInt();int bag scanner.nextInt();int[…

010---基于Verilog HDL的分頻器設計

文章目錄 摘要一、時序圖二、程序設計2.1 rtl2.2 tb 三、仿真分析四、實用性 摘要 文章為學習記錄。繪制時序圖&#xff0c;編碼。通過修改分頻值參數&#xff0c;實現一定范圍分頻值內的任意分頻器設計。 一、時序圖 二、程序設計 2.1 rtl module divider #(parameter D…

維度建模事實表技術基礎解析(以電商場景為例)

維度建模事實表技術基礎解析(以電商場景為例) 1. 事實表結構 定義:事實表是維度建模的核心,由外鍵(關聯維度表)、度量值(可量化的業務指標)及退化維度(冗余的維度屬性)組成。其本質是記錄業務過程中的度量事件,例如電商訂單金額、商品庫存量等。 場景識別:適用于…

Redis 主從復制、哨兵與集群的關系及工作原理詳解

一、核心概念與關系 Redis 的 主從復制、哨兵&#xff08;Sentinel&#xff09; 和 集群&#xff08;Cluster&#xff09; 是逐步演進的高可用與分布式解決方案&#xff0c;三者關系如下&#xff1a; 主從復制&#xff1a;數據冗余與讀寫分離的基礎。 哨兵&#xff1a;在主從…

確認機制的分類及其區別與聯系探討

在傳輸控制中&#xff0c;確認機制&#xff08;ACK 機制&#xff09;作為反饋模塊在實現擁塞控制、丟包恢復和狀態監測等功能中起到了至關重要的作用。今天我將基于之前發表的論文研究成果&#xff0c;對確認機制的分類進行系統梳理&#xff0c;并討論各類機制之間的區別與聯系…

115 道 MySQL 面試題,從簡單到深入!

1. 什么是數據庫事務&#xff1f; 數據庫事務是一個作為單個邏輯工作單元執行的一系列操作。事務具有ACID屬性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔離性&#xff08;Isolation&#xff09;和持久性&#xf…