FFmpeg,如何插入SEI自定義數據

FFmpeg,如何插入SEI自定義數據

一、什么是SEI?

SEI(Supplemental Enhancement Information,補充增強信息)是H.264/H.265視頻編碼標準中的一種元數據載體,它允許在視頻流中嵌入額外的信息,如時間戳、人臉框、設備信息等增強信息。

與視頻幀數據不同,SEI信息不是解碼必需的,但可以用于增強播放體驗或傳遞輔助信息。

二、AVPacket中插入SEI

在ffmpeg中,H264裸流的數據,一個 AVPacket 可能包含多個 NALU,它們之間通過起始碼 0x00 00 00 010x00 00 01 分隔。

一般情況下,SEI需要插入到IDR幀之前。

一個AVPacket中的關鍵幀數據包含SPS、PPS、IDR,而SEI的插入位置在PPS之后,IDR之前,如下圖所示。

三、如何構建一個SEI NALU

1、SEI NALU格式

SEI NALU由起始碼(0x00 00 00 01)、nal head(0x06)、payload type(0x05)、UVLC編碼字節數、rbsp_data組成。其中rbsp_data由uuid(16字節)、payload、結束標記(0x80)組成,具體格式如下圖所示。

字段名

說明

示例值或長度

Start Code

起始碼(Annex-B 格式)

0x00000001

NAL Header

NAL 類型為 SEI

0x06

SEI Payload Type

固定為 5,表示未注冊用戶數據

0x05

SEI Payload Size

整個 payload 長度(字節)

0x2F(47)

UUID

16 字節,唯一標識數據類型

dc45e9bd...

Payload Content

自定義數據內容(如字符串)

"hello"

RBSP Trailing Bits

固定結尾對齊字節

0x80

2、UVLC編碼字節數

UVLC(Unsigned Variable Length Coding)是H.264/H.265標準中用于編碼SEI的payload_size和payload_type的壓縮算法,其核心特點是:

  • 無符號整數編碼:僅處理非負整數
  • 前綴碼結構:通過0xFF標記實現變長
  • 自描述性:解碼器無需預知長度即可解析

UVLC采用累加式多字節表示法:

若值 < 0xFF:用1字節直接表示

? ? value = 100 0x64

若值 0xFF

  • 第1字節固定為0xFF
  • 剩余值遞歸編碼(value -= 255)

value = 300 0xFF 0x2D (300 = 255 + 45)

value = 550 0xFF 0xFF 0x28 (550 = 255 + 255 + 40)

3、rbsp_data

四、參考信息

1、NALU類型

NALU 的類型,共 32 種(0-31),常見類型如下表:

nal_unit_type?

NALU 類型

說明

0

未指定

保留,不使用

1

非 IDR 圖像的片(Slice)

P 幀或 B 幀的 Slice 數據

2

數據分區 A

用于分片編碼,存放重要的運動信息

3

數據分區 B

存放次要的運動信息

4

數據分區 C

存放殘差數據

5

IDR 圖像的片(Slice)

立即刷新圖像(關鍵幀)的 Slice 數據,解碼時需清空參考幀緩沖區

6

SEI(補充增強信息)

包含額外信息(如時間戳、用戶數據),不影響基本解碼

7

SPS(序列參數集)

包含視頻序列的全局參數(如分辨率、profile 等)

8

PPS(圖像參數集)

包含圖像級參數(如量化參數、熵編碼方式)

9

訪問單元分隔符

標記視頻幀的開始

10

序列結束符

標記視頻序列的結束

11

流結束符

標記整個碼流的結束

12

填充數據

用于增加碼流長度(如測試場景)

13-23

保留

用于 H.264 的擴展功能

24-31

未指定

通常用于 RTP 等網絡協議的封裝

2. RBSP(Raw Byte Sequence Payload)

RBSP 是 NALU 的負載數據,包含 VCL 層的壓縮信息(如 Slice 數據、參數集內容)。它由SODB(String of Data Bits) 經過處理后得到:

SODB:VCL 層輸出的原始比特流(如預測殘差、運動矢量等);

RBSP:在 SODB 末尾添加停止位(1 個 "1" 比特后跟若干 "0" 比特),使其字節對齊,形成 RBSP。

3、關鍵 NALU 類型詳解

3.1 SPS(序列參數集,nal_unit_type=7)

SPS 是視頻序列的全局配置,包含影響整個序列的參數,解析時需優先處理。常見參數如下:

// SPS參數示例(部分關鍵參數)
profile_idc???????????????? // 編碼profile(如Baseline=66,Main=77,High=100)
level_idc?????????????????? // 編碼level(如3.0=30,3.1=31)
seq_parameter_set_id??????? // SPS的ID(用于關聯PPS)
chroma_format_idc?????????? // 色度格式(如1=4:2:0,2=4:2:2,3=4:4:4)
bit_depth_luma_minus8?????? // 亮度位深度(通常為8)
bit_depth_chroma_minus8???? // 色度位深度(通常為8)
log2_max_frame_num_minus4?? // 最大幀號的對數(用于計算幀號范圍)
pic_order_cnt_type????????? // 圖像順序計數類型(0-2,控制POC的計算方式)
max_num_ref_frames????????? // 最大參考幀數量
pic_width_in_mbs_minus1???? // 視頻寬度(以宏塊為單位,實際寬度=(值+1)*16)
pic_height_in_map_units_minus1 // 視頻高度(以宏塊為單位)
frame_mbs_only_flag???????? // 是否僅幀編碼(0=支持幀/場混合,1=僅幀)

3.2 PPS(圖像參數集,nal_unit_type=8)

PPS 定義單幅圖像的參數,依賴于 SPS,常見參數如下:

// PPS參數示例(部分關鍵參數)
pic_parameter_set_id??????? // PPS的ID
seq_parameter_set_id??????? // 關聯的SPS的ID
entropy_coding_mode_flag??? // 熵編碼方式(0=CAVLC,1=CABAC)
num_ref_idx_l0_default_active_minus1 // 默認的前向參考幀列表長度
num_ref_idx_l1_default_active_minus1 // 默認的后向參考幀列表長度
weighted_pred_flag????????? // 是否使用加權預測(對P幀)
weighted_bipred_idc???????? // 雙向預測加權模式(0-2)
pic_init_qp_minus26???????? // 初始量化參數(QP=值+26)
deblocking_filter_control_present_flag // 是否存在去塊濾波控制信息

3.3. IDR Slice(即時解碼刷新,nal_unit_type=5)

IDR Slice 是一種特殊的 I Slice,屬于關鍵幀:

解碼 IDR Slice 時,解碼器會清空所有參考幀緩沖區,確保后續幀的解碼不依賴之前的錯誤幀,從而終止錯誤傳播。

IDR Slice 必須包含完整的幀內預測信息,不依賴其他幀。

3.4. 非 IDR Slice(nal_unit_type=1)

包括 P Slice 和 B Slice:

P Slice:依賴前向參考幀(已解碼的 I/P 幀)進行預測;

B Slice:依賴雙向參考幀(前向和后向的 I/P 幀)進行預測,壓縮效率更高。

3.5. SEI(補充增強信息,nal_unit_type=6)

攜帶與解碼無關的輔助信息,常見類型:

時間戳信息(如 NTP 時間);

用戶數據(如字幕、水印);

場景切換標記;

碼流統計信息。

具體實現方式參見:

https://gitee.com/hanshuang741852/mem-push-streamhttps://gitee.com/hanshuang741852/mem-push-stream

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

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

相關文章

為什么分類任務偏愛交叉熵?MSE 為何折戟?

在機器學習的世界里&#xff0c;損失函數是模型的“指南針”——它定義了模型“好壞”的標準&#xff0c;直接決定了參數優化的方向。對于分類任務&#xff08;比如判斷一張圖片是貓還是狗&#xff09;&#xff0c;我們通常會選擇交叉熵作為損失函數&#xff1b;而在回歸任務&a…

[echarts]橫向柱狀圖

前言 接到一個需求&#xff0c;需要展示一個橫向的柱狀圖&#xff0c;按數量從大到小排序&#xff0c;并定時刷新 使用react配合echarts進行實現。 react引入echarts import React, { useEffect, useRef } from react; import * as echarts from echarts; import DeviceApi fro…

【開源項目】輕量加速利器 HubProxy 自建 Docker、GitHub 下載加速服務

??引言?? 如果你經常被 Docker 鏡像拉取、GitHub 文件下載的龜速折磨&#xff0c;又不想依賴第三方加速服務&#xff08;擔心穩定性或隱私&#xff09;&#xff0c;今天分享的 ??HubProxy?? 可能正是你需要的。這個開源工具用一行命令就能部署&#xff0c;以極低資源消…

java web jsp jstl練習

JSP 的學習。 核心功能模塊 1. 源代碼層 &#xff08; src &#xff09; HelloWorld &#xff1a;主程序入口領域模型 &#xff1a; domain 包含User.java和ceshi.java控制器 &#xff1a; servlet 包含登錄驗證和驗證碼相關ServletWeb表現層 &#xff08; web &#xff09; JS…

VSCode 完全指南:釋放你的編碼潛能

零、簡介 在當今的軟件開發領域&#xff0c;代碼編輯器的選擇至關重要&#xff0c;它就像是工匠手中的工具&#xff0c;直接影響著工作效率和成果質量。Visual Studio Code&#xff08;簡稱 VSCode&#xff09;自問世以來&#xff0c;迅速在全球開發者社區中嶄露頭角&#xff…

《n8n基礎教學》第一節:如何使用編輯器UI界面

在本課中&#xff0c;你將學習如何操作編輯器界面。我們將瀏覽畫布&#xff0c;向您展示每個圖標的含義&#xff0c;以及在 n8n 中構建工作流程時在哪里可以找到您需要的東西。本課程基于 n8n 最新版本 。在其他版本中&#xff0c;某些用戶界面可能有所不同&#xff0c;但這不會…

gcc g++ makefile CMakeLists.txt cmake make 的關系

gcc&#xff1a;C語言編譯器g&#xff1a;C編譯器makefile&#xff1a;定義編譯規則、依賴關系和構建目標。可以手動編寫&#xff0c;也可以由CMakeLists.txt生成cmake&#xff1a;讀取CMakeLists.txt文件&#xff0c;生成Makefilemake&#xff1a;構建工具&#xff0c;執行Mak…

SFT 訓練器

SFT 訓練器 “訓練時間到!” 我們現在終于可以創建一個監督微調訓練器的實例了: trainer = SFTTrainer( model=model, processing_class=tokenizer, args=sft_config, train_dataset=dataset, )SFTTrainer 已經對數據集進行了預處理,因此我們可以深入查看,了解每個小批次…

Android Material Components 全面解析:打造現代化 Material Design 應用

引言 在當今移動應用開發領域&#xff0c;用戶體驗(UX)已成為決定應用成功與否的關鍵因素之一。Google推出的Material Design設計語言為開發者提供了一套完整的視覺、交互和動效規范&#xff0c;而Material Components for Android(MDC-Android)則是將這些設計理念轉化為可重用…

Windows使用Powershell自動安裝SqlServer2025服務器與SSMS管理工具

安裝結果: 安裝前準備: 1.下載mssql server 2025安裝器 2.下載iso鏡像 3.下載好SSMS安裝程序,并放到iso同目錄下 4.執行腳本開始自動安裝

09 RK3568 Debian11 ES8388 模擬音頻輸出

1、設備樹配置 確認自己的i2c,使用sdk帶的驅動es8323 /SDK/kernel/sound/soc/codecs/es8323.c es8388_sound: es8388-sound {status = "okay";compatible = "rockchip,multicodecs-card"; rockchip,card-name = "rockchip,es8388-codec"; …

力扣-199.二叉樹的右視圖

題目鏈接 199.二叉樹的右視圖 class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> res new ArrayList<>();Queue<TreeNode> queue new LinkedList<>();if (root null)return res;queue.offer(root);while …

Android Bitmap 完全指南:從基礎到高級優化

在 Android 開發中&#xff0c;圖像處理是一個核心且復雜的領域&#xff0c;而 Bitmap 作為 Android 中表示圖像的基本單位&#xff0c;貫穿了從簡單圖片顯示到復雜圖像編輯的各個場景。然而&#xff0c;Bitmap 處理不當往往會導致應用性能下降、內存溢出&#xff08;OOM&#…

unity日志過濾器

背景&#xff1a;之前做游戲的時候和同組的同事聊過說日志過濾盡量不要限制大家怎么使用日志打印的接口&#xff0c;不要加額外的參數&#xff0c;比如多加一個標簽string,或者使用特定的接口&#xff0c;枚舉。最好就是日志大家還是用Debug.Log無感去用&#xff0c;然后通過勾…

OpenGL Camera

一. lookAt函數的參數含義glm::mat4 view glm::lookAt(cameraPos, // 相機在世界坐標系中的位置&#xff08;任意值&#xff09;cameraPos cameraFront, // 相機看向的目標點&#xff08;位置朝向&#xff09;cameraUp // 相機的"上方向"&#xff08;通…

Android RTMP推送|輕量級RTSP服務同屏實踐:屏幕+音頻+錄像全鏈路落地方案

一、背景&#xff1a;從“移動終端”到“遠程協作節點”&#xff0c;同屏音頻錄像為何成剛需&#xff1f; 在數字化辦公、智慧醫療與遠程教育等快速發展的推動下&#xff0c;手機作為隨身終端&#xff0c;已不再只是“內容接收者”&#xff0c;而逐步成為遠程信息發布與可視化…

NLP 和 LLM 區別、對比 和關系

理解自然語言處理(NLP)和大語言模型(LLM)的區別、對比和關系對于把握現代人工智能的發展非常重要。以下是清晰的分析: 核心定義 NLP (Natural Language Processing - 自然語言處理): 是什么: 一個廣闊的計算機科學和人工智能子領域,致力于讓計算機能夠理解、解釋、操作…

Altium 移除在原理圖之外的元器件

Altium新手&#xff0c;最近在畫原理圖的時候&#xff0c;遇見了這種不小心拖到界面外的元器件&#xff0c;發現拖不回來了了&#xff0c;查閱了一下&#xff0c;總結在這里 官方推薦的方法----------------使用“SCH List”面板刪除 鏈接&#xff1a;如何移除在原理圖之外的元…

【Linux我做主】細說環境變量

Linux環境變量Linux環境變量github地址前言1. 基本概念環境變量的本質2. 認識常見的環境變量PATH查看PATH修改PATHHOMESHELL其他常見環境變量PWD與OLDPWDLOGNAME與USERSSH_TTY由環境變量理解權限使用系統調用獲取環境變量理解權限3. 總結什么是環境變量3. 命令行參數和環境變量…

leecode-15 三數之和

我的解法&#xff08;不是完全解309/314&#xff09;我的思路是定義一個left和一個right&#xff0c;然后在向集合里去查詢&#xff0c;看看有沒有除了nums[left]&#xff0c;和nums[right]的第三個元素&#xff0c;把這個問題轉換為一個遍歷查找問題 利用List.contains()方法來…