ffmpeg中格式轉換需要注意點總結

某些封裝格式(例如MP4/FLV/MKV等)的H.264碼流的SPS和PPS信息存儲在AVCodeccontext結構體的extradata中。分離某些封裝格式(例如MP4/FLV/MKV等)中的H.264的時候,需要首先寫入SPS和PPS,否則會導致分離出來的數據沒有SPS、PPS而無法播。需要使用ffmpeg中名稱為“h264 mp4toannexb”的bitstream filter處理

關鍵概念解析與操作指南


?一、SPS/PPS 的作用與存儲位置?
  1. ?SPS (Sequence Parameter Set)?
    定義視頻序列的全局參數,包括分辨率、幀率、編碼級別等。
  2. ?PPS (Picture Parameter Set)?
    定義圖像解碼參數,如熵編碼模式、分片參數等。
  3. ?存儲位置?
    • 在 MP4/FLV/MKV 等封裝格式中,SPS/PPS 通常存儲在 ?AVCodecContext->extradata? 中,而非嵌入到每個關鍵幀。
    • 裸 H.264 流(如 Annex B 格式)要求在每個關鍵幀(IDR幀)前攜帶 SPS/PPS。

?二、問題根源分析?

當直接從封裝格式(如 MP4)中提取 H.264 裸流時:

  • ?直接提取的缺陷?:
    輸出的 H.264 數據缺少 SPS/PPS 頭部信息,導致播放器無法初始化解碼器。
  • ?典型報錯?:

    [h264 @ 0x7f8a5c006800] no frame! Invalid NAL unit size


?三、解決方案:使用 Bitstream Filter?

通過 FFmpeg 的 ?h264_mp4toannexb? 比特流過濾器,實現以下功能:

  1. ?從?extradata?提取 SPS/PPS?:
    自動讀取?AVCodecContext->extradata?中的參數集。
  2. ?轉換為 Annex B 格式?:
    • 在碼流起始位置插入 SPS/PPS。
    • 在每個關鍵幀前插入起始碼?0x00000001?或?0x000001

?四、操作命令示例?

提取 MP4 中的 H.264 裸流并修復 SPS/PPS:

ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb output.h264

  • ?參數說明?:
    • -c:v copy:直接復制視頻流,不重新編碼。
    • -bsf:v h264_mp4toannexb:對視頻流應用比特流過濾器。

?五、不同封裝格式的適配?
?封裝格式??比特流過濾器??作用?
MP4h264_mp4toannexb插入 SPS/PPS,添加起始碼
FLVh264_mp4toannexb同上(FLV 的 H.264 存儲方式類似 MP4)
MKVh264_mp4toannexb同上
TS無需過濾器TS 流已符合 Annex B 格式

?六、驗證輸出文件?
  1. ?使用?ffprobe?檢查?:

    ffprobe -v error -show_streams output.h264

    確認輸出中包含?codec_tag_string=avc1?和?extradata
  2. ?播放測試?:

    ffplay output.h264


?七、底層原理詳解?
  1. ?extradata?結構?
    • MP4 中?extradata?的格式為 ?AVCDecoderConfigurationRecord?,包含 SPS/PPS 的二進制數據。
    • h264_mp4toannexb?過濾器解析此結構,將其轉換為 Annex B 的頭部。
  2. ?Annex B 格式要求?
    • 每個 NAL 單元以起始碼?0x00000001?或?0x000001?開頭。
    • SPS/PPS 必須出現在碼流開頭或關鍵幀前。

?八、擴展場景:處理多路流?

若需合并多個 MP4 文件的 H.264 流,需對每個輸入單獨應用過濾器:

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex \ "[0:v]bsf=h264_mp4toannexb[0v];[1:v]bsf=h264_mp4toannexb[1v]; \ [0v][1v]concat=n=2:v=1" -c:v libx264 output_combined.mp4


通過上述方法,可確保提取的 H.264 裸流符合播放器要求,避免因缺失 SPS/PPS 導致的解碼失敗問題。

ffmpeg -i 1.mp4 -c:v copy output_without_sps_pps.h264轉換完成后通過ffplay播放的h264為什么播放速度很快

問題原因解析

使用?ffmpeg -i 1.mp4 -c:v copy output.h264?轉換的 H.264 裸流播放速度異常加快,主要與 ?時間戳信息丟失? 和 ?封裝格式差異? 相關,具體原因如下:


1. ?時間基(Timebase)未正確傳遞?
  • ?MP4 容器特性?:MP4 文件的時間戳基值(time_base)通常為?1/1000?或?1/90000,而 H.264 裸流無容器層,默認時間基可能被錯誤解析為?1/25?或?1/30[?2][?7]。
  • ?播放器誤判?:ffplay?根據 H.264 裸流的 NAL 單元間隔推算幀率,若時間戳缺失或錯誤,會強制按默認高幀率(如 25fps)播放[?1][?7]。
2. ?關鍵幀間隔(GOP)與 B/P 幀依賴斷裂?
  • ?-c:v copy?的局限性?:直接復制流時,B/P 幀的解碼依賴關系可能因裸流缺少容器層的元數據而斷裂,導致解碼器跳過參考幀計算,加速播放[?2][?7]。
3. ?SPS/PPS 信息未嵌入?
  • ?缺失參數集?:MP4 中的 SPS/PPS 存儲在?extradata?中,直接復制時未通過?h264_mp4toannexb?過濾器插入碼流,播放器可能無法正確初始化解碼器時間軸[?1][?2]。

解決方案

1. ?強制指定輸出幀率?

通過?-r?參數顯式定義輸出幀率,覆蓋默認值:

 

bashCopy Code

ffmpeg -i 1.mp4 -c:v copy -r 30 output.h264

  • ?作用?:強制 H.264 裸流按 30fps 播放,避免時間基誤判[?2][?7]。
2. ?添加比特流過濾器處理時間戳?

使用?setpts?濾鏡修正時間戳:

 

bashCopy Code

ffmpeg -i 1.mp4 -c:v copy -bsf:v h264_mp4toannexb -vf "setpts=PTS-STARTPTS" output.h264

  • ?關鍵參數?:
    • -bsf:v h264_mp4toannexb:插入 SPS/PPS 并修正 NAL 單元格式[?1][?2]。
    • setpts=PTS-STARTPTS:重置時間戳為從零開始,消除容器時間基差異[?7]。
3. ?驗證與調試?
  • ?檢查時間戳信息?:
     

    bashCopy Code

    ffprobe -show_frames output.h264 | grep "pkt_pts_time"

    確認輸出幀的?pkt_pts_time?均勻遞增(如 0.033s 間隔對應 30fps)[?7]。
  • ?對比播放效果?:
     

    bashCopy Code

    ffplay -vf "setpts=PTS-STARTPTS" output.h264 # 強制按原始速度播放


擴展場景:直播推流中的類似問題

若需將 USB 相機的 RGBA 數據編碼為 H.264 并推流至 RTMP,需在編碼器初始化時手動插入 SPS/PPS,并通過?avcodec_parameters_from_context?傳遞至輸出流上下文,否則 RTMP 播放會出現加速或花屏[?1][?2]。


總結

H.264 裸流播放速度異常的本質是 ?時間戳與幀率元數據丟失?,需通過過濾器修正時間基或顯式指定幀率參數[?1][?2][?7]。

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

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

相關文章

小型語言模型與檢索增強生成系統的融合:機遇與挑戰

小型語言模型(SLMs)是大型語言模型(LLMs)的緊湊版本。其參數量通常比大型模型少得多:約30億或更少。這使得它們具有相對輕量級的特點,推理速度更快。 當前研究的一個有趣方向是將SLMs整合到檢索增強生成(RAG)系統中以提升性能。本文探討這一最新趨勢&…

使用 .NET 9 和 Azure 構建云原生應用程序:有什么新功能?

隨著 .NET 9 推出一系列以云為中心的增強功能,開發人員擁有比以往更多的工具來在 Azure 上創建可擴展、高性能的云原生應用程序。讓我們深入了解 .NET 9 中的一些出色功能,這些功能使構建、部署和優化云應用程序變得更加容易,并附有示例以幫助…

PostgreSQL:表分區與繼承

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編…

Linux / Windows 下 Mamba / Vim / Vmamba 安裝教程及安裝包索引

目錄 背景0. 前期環境查詢/需求分析1. Linux 平臺1.1 Mamba1.2 Vim1.3 Vmamba 2. Windows 平臺2.1 Mamba2.1.1 Mamba 12.1.2 Mamba 2- 治標不治本- 終極版- 高算力版 2.2 Vim- 治標不治本- 終極版- 高算力版 2.3 Vmamba- 治標不治本- 終極版- 高算力版 3. Linux / Windows 雙平…

開源項目更新到個人倉庫二次開發并保持同步

當你克隆了一個開源項目并將其推送到自己的倉庫后,定期更新該開源項目并與你的本地修改同步是一個常見的需求。為了高效地管理這一過程,你可以使用 Git 的 upstream 遠程倉庫和 rebase 技術來保持代碼的整潔和線性歷史。 1. 設置上游遠程倉庫 首先&…

多輸入多輸出 | Matlab實現BO-GRU貝葉斯優化門控循環單元多輸入多輸出預測

多輸入多輸出 | Matlab實現BO-GRU貝葉斯優化門控循環單元多輸入多輸出預測 目錄 多輸入多輸出 | Matlab實現BO-GRU貝葉斯優化門控循環單元多輸入多輸出預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 Matlab實現BO-GRU貝葉斯優化門控循環單元多輸入多輸出預測&#…

MCP(模型上下文協議)入門指南:用Web開發的視角理解下一代AI引擎

引言:當Java Web遇到長期記憶 想象你正在開發一個在線法律咨詢平臺。用戶上傳一份300頁的合同后,連續提出了10個問題: 第3頁的違約條款具體內容是什么?請對比第15頁和第120頁的支付條件整份合同中最高的賠償金額是多少&#xff…

簡易Minecraft python

廢話多說 以下是一個基于Python和ModernGL的簡化版3D沙盒游戲框架。由于代碼長度限制,這里提供一個核心實現(約500行),您可以通過添加更多功能和內容來擴展它: python import pygame import moderngl import numpy a…

element-ui自制樹形穿梭框

1、需求 由于業務特殊需求,想要element穿梭框功能,數據是二級樹形結構,選中左邊數據穿梭到右邊后,左邊數據不變。多次選中左邊相同數據進行穿梭操作,右邊數據會多次增加相同的數據。右邊數據穿梭回左邊時,…

WPS宏開發手冊——Excel實戰

目錄 系列文章5、Excel實戰使用for循環給10*10的表格填充行列之和使用for循環將10*10表格中的偶數值提取到另一個sheet頁使用for循環給寫一個99乘法表按市場成員名稱分類(即市場成員A、B、C...),統計月內不同時間段表1和表2的乘積之和&#x…

計算機網絡-TCP的流量控制

內容來源:小林coding 本文是對小林coding的TPC流量控制的精簡總結 什么是流量控制 發送方不能無腦的發數據給接收方,要考慮接收方處理能力 如果一直無腦的發數據給對方,但對方處理不過來,那么就會導致觸發重發機制 從而導致網…

Spring Boot 七種事務傳播行為只有 REQUIRES_NEW 和 NESTED 支持部分回滾的分析

Spring Boot 七種事務傳播行為支持部分回滾的分析 支持部分回滾的傳播行為 REQUIRES_NEW:始終開啟新事務,獨立于外部事務,失敗時僅自身回滾。NESTED:在當前事務中創建保存點(Savepoint),可局部…

突破反爬困境:SDK開發,瀏覽器模塊(七)

聲明 本文所討論的內容及技術均純屬學術交流與技術研究目的,旨在探討和總結互聯網數據流動、前后端技術架構及安全防御中的技術演進。文中提及的各類技術手段和策略均僅供技術人員在合法與合規的前提下進行研究、學習與防御測試之用。 作者不支持亦不鼓勵任何未經授…

C++數據排序( 附源碼 )

一.冒泡排序 原理:自左向右依次遍歷,若相鄰兩數順序錯誤,則交換兩數. 這樣,每一輪結束后,最大/最小的數就會到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

I2C 讀寫 AT24C02

根據AT24C02的 Datasheet 可知AT24C02有2K bit&#xff0c;即256B&#xff0c;分為32頁,每頁8個字節&#xff0c;結合數據手冊和原理圖可以得知&#xff0c;板載AT24C02的讀地址為0xA2&#xff0c;寫地址為0xA3&#xff1a; #define AT24C02_ADDR_WRITE 0xA2 #define AT24C02_…

K8S學習之基礎七十四:部署在線書店bookinfo

部署在線書店bookinfo 在線書店-bookinfo 該應用由四個單獨的微服務構成&#xff0c;這個應用模仿在線書店的一個分類&#xff0c;顯示一本書的信息&#xff0c;頁面上會顯示一本書的描述&#xff0c;書籍的細節&#xff08;ISBN、頁數等&#xff09;&#xff0c;以及關于這本…

Linux 查找文本中控制字符所在的行

參考資料 ASCIIコード表 目錄 一. 業務背景二. 遇到的問題三. 分析3.1 url編碼的前置知識3.2 出現控制字符的transactionid分析3.3 16進制分析 四. 從文本中查找控制字符所在的行五. 控制字符一覽 一. 業務背景 ?在項目中&#xff0c;業務請求對應著下URL http://www.test.…

python將pdf文件轉為圖片,如果pdf文件包含多頁,將轉化的多個圖片通過垂直或者水平合并成一張圖片

要將PDF文件轉換為圖片&#xff0c;并將多頁PDF垂直合并成一張圖片&#xff0c;可以使用PyMuPDF&#xff08;也稱為fitz&#xff09;庫來讀取PDF文件&#xff0c;并使用Pillow庫來處理和合并圖片。以下是一個示例代碼&#xff0c;展示了如何實現這個功能&#xff1a; 首先&…

HarmonyOS 基礎組件和基礎布局的介紹

1. HarmonyOS 基礎組件 1.1 Text 文本組件 Text(this.message)//文本內容.width(200).height(50).margin({ top: 20, left: 20 }).fontSize(30)//字體大小.maxLines(1)// 最大行數.textOverflow({ overflow: TextOverflow.Ellipsis })// 超出顯示....fontColor(Color.Black).…

FrameWork基礎案例解析(四)

文章目錄 單獨拉取framework開機與開機動畫橫屏Android.mk語法單獨編譯SDKmake 忽略warning單獨修改和編譯Camera2單獨編譯Launcher3Android Studio 導入、修改、編譯Settings導入 Android Studio 導入、修改、編譯Launcher3android 開機默認進入指定Launcher植入自己的apk到系…