[ffmpeg] AVFrame 功能整理

背景

AVFrame 主要用來存儲編碼前的原始數據。

AVFrame 結構體

在 frame.h 文件中

主要變量

uint8_t *data[AV_NUM_DATA_POINTERS]; // 存儲每個 planes 的數據
int linesize[AV_NUM_DATA_POINTERS]; // 每一行的音視頻數據
uint8_t **extended_data; // 視頻,指向 data, 音頻有需要則指向新的地址。由于音頻可以支持多個聲道,比如 22,data 存不在,則需要放到這里。
int width, height; // 視頻寬和高
int nb_samples;  // 音頻每個通道的采樣數
int format; // 音視頻格式  AVPixelFormat  AVSampleFormat
int key_frame; // 是不是關鍵幀
enum AVPictureType pict_type; // 圖片類型
AVRational sample_aspect_ratio; // 寬高比
int64_t pts; // 渲染時間
AVRational time_base; // 時間基
int sample_rate; // 采樣率
AVBufferRef *buf[AV_NUM_DATA_POINTERS]; // 實際數據存儲地方,data 指針指向這里。通過引用來控制是否釋放內存。
AVBufferRef **extended_buf; // 類似 buf,存儲 extended_data
AVChannelLayout ch_layout; // 音頻通道數

AVFrame 函數

常用函數

av_frame_alloc

作用:分配 AVFrame,并設置默認值,通過 av_frame_free 釋放。且不會創建 data buffer,因為此時他還不知道要分配多大的內存。

AVFrame *av_frame_alloc(void);
av_frame_free

釋放 AVFrame,并減少動態分配變量的引用計數。

void av_frame_free(AVFrame **frame);
av_frame_ref

拷貝 src 的值到 dst,并增加 buf 和 extended_buf 引用 (為啥引用到1 就刪除)

int av_frame_ref(AVFrame *dst, const AVFrame *src);
av_frame_unref

減少引用并重置各字段

void av_frame_unref(AVFrame *frame);	
av_frame_get_buffer

為音視頻分配內存,調用這個函數前
視頻需要設置:格式、寬和高
音頻需要設置:采樣格式、聲道數、每個聲道的音頻采樣數
否則,不知道要分配多大的內存。

int av_frame_get_buffer(AVFrame *frame, int align);
不常用函數
av_frame_clone

相當于 av_frame_alloc()+av_frame_ref()

AVFrame *av_frame_clone(const AVFrame *src);
av_frame_move_ref

將 src 賦值給 dst

void av_frame_move_ref(AVFrame *dst, AVFrame *src);
av_frame_is_writable

判斷 frame 是否可寫,ffmpeg 好像認為有多個引用,則不可寫。應該是需要加鎖才能確保安全。

int av_frame_is_writable(AVFrame *frame);
av_frame_make_writable

讓 frame 可寫,如果有多個引用frame地址,則重新創建一塊內存。

int av_frame_make_writable(AVFrame *frame);
av_frame_copy

只拷貝 src 的 buf 到 dst,需要提前確保兩者的 buf 內存一樣。

int av_frame_copy(AVFrame *dst, const AVFrame *src);
av_frame_copy_props

只拷貝元信息,應該是只那些輔助信息吧,比如 pts、timebase、sidedata等

int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
av_frame_get_plane_buffer

獲取某個 plane 的數據

AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane);
side_data

side_data 相關

AVFrameSideData *av_frame_new_side_data(AVFrame *frame,enum AVFrameSideDataType type,size_t size);
AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,enum AVFrameSideDataType type,AVBufferRef *buf);AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,enum AVFrameSideDataType type);
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type);
// 返回 sidedata 類型
const char *av_frame_side_data_name(enum AVFrameSideDataType type);
av_frame_apply_cropping

對數據進行裁剪

int av_frame_apply_cropping(AVFrame *frame, int flags);

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

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

相關文章

java實現網絡聊天

網絡聊天實現步驟(從功能談論方法): 客戶端: 1.登錄面板:注冊提醒用戶注冊格式,登錄賬號密碼不為空,點擊登錄的時候需要連接服務器端,啟動聊天面板。(監聽用戶點擊登錄…

Windows下nginx的啟動,重啟,關閉等功能bat腳本

echo off rem 提供Windows下nginx的啟動,重啟,關閉功能echo begincls ::ngxin 所在的盤符 set NGINX_PATHG:::nginx 所在目錄 set NGINX_DIRG:\projects\nginx-1.24.0\ color 0a TITLE Nginx 管理程序增強版CLSecho. echo. ** Nginx 管理程序 *** echo.…

JAVA使用HTTP代碼示例

你好,Java開發者們!今天,我要給你們帶來一場硬核的盛宴,那就是在Java中使用HTTP協議進行網絡通信的代碼示例。準備好接受挑戰了嗎?Lets go! 首先,我們需要導入一些必要的庫,它們將成…

C++枚舉類

枚舉 C11有作用域枚舉和無作用域枚舉 無作用域枚舉 特點 全局作用域:無作用域枚舉的成員(枚舉值)在包含它們的作用域內是直接可見的,不需要使用枚舉類型名稱作為前綴。 隱式類型轉換:無作用域枚舉的成員可以隱式地轉換…

鴻蒙開發組件之ForEach列表

一、ForEach函數 ForEach函數是一個迭代函數,需要傳遞兩個必須參數和一個可選參數。主要通過迭代來獲取參數arr中的數據不斷的生成單個Item來生成鴻蒙中的列表樣式 二、先創建單個的Item的UI 通過嵌套Row與Column來實現單個Item的UI。例如圖中沒有折扣的可以看成一…

用23種設計模式打造一個cocos creator的游戲框架----(八)適配器模式

1、模式標準 模式名稱:適配器模式 模式分類:結構型 模式意圖:適配器模式的意圖是將一個類的接口轉換成客戶端期望的另一個接口。適配器模式使原本接口不兼容的類可以一起工作。 結構圖: 適用于: 系統需要使用現有的…

309. 買賣股票的最佳時機含冷凍期(leetcode) 動態規劃思想

文章目錄 前言一、題目分析二、算法原理1.狀態表示2.狀態轉移方程3.初始化邊界條件4.填表順序5.返回值是什么 三、代碼實現總結 前言 在本文章中,我們將要詳細介紹一下Leetcode中買賣股票的最佳時機含冷凍期相關的內容,本題采用動態規劃的思想解決 一、…

uniapp藍牙傳輸中文亂碼問題

uniapp藍牙傳輸中文亂碼問題 0 現狀 傳輸數字和字母的json字符串都可以解析,有個中文的硬件那邊就解析不了,替換一下發數據的處理函數即可 1 原先字符串轉化函數 const stringToBytes (msg) > {const buffer new ArrayBuffer(msg.length)const …

eclipse中一些文件的作用

.idea文件夾 .idea和.settings文件夾是IntelliJ IDEA的配置文件夾,用于存儲項目的配置信息。這些文件夾中包含了許多XML文件,這些XML文件包含了項目的各種配置信息,例如編譯選項、運行配置、代碼樣式、版本控制等等。 包含了一些名為modules.…

PyQt6 QDateEdit日期控件

?鋒哥原創的PyQt6視頻教程: 2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~共計39條視頻,包括:2024版 PyQt6 Python桌面開發 視頻教程(無廢話…

多數元素算法(leetcode第169題)

題目描述: 給定一個大小為 n 的數組 nums ,返回其中的多數元素。多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。你可以假設數組是非空的,并且給定的數組總是存在多數元素。示例 1:輸入:nums [3,2,3] 輸出&am…

Python:可以做什么?

簡介 Python是一種高級編程語言,因其簡單易學、代碼可讀性強和擁有豐富的標準庫而廣受歡迎。Python可以用于許多不同領域,主要包括: 數據分析與數據科學:Python有強大的數據處理和分析庫,如Pandas、NumPy和SciPy&…

空中消防員:無人機森林防火應用全面升級

森林是生態系統的重要組成部分,也是人類得以生存的關鍵。我國森林面積廣大,存在火災頻發的困境。提升森林火災防控能力是維護生態平衡、保護資源和保障人民生命安全的必要步驟。隨著無人機技術的發展,其在無人機森林防火中的應用為傳統巡查工…

Linux PSI-----Pressure Stall information

PSI——壓力阻塞信息 當CPU、memory或IO設備處于競爭狀態,業務負載會遭受時延毛刺、吞吐量降低, 及面臨OOM的風險。 如果沒有一種準確的方法度量系統競爭程度,則有兩種后果:一種是用戶過于節制, 未充分利用系統資源&…

Mybatis與Spring結合深探——MapperFactoryBean的奧秘

文章目錄 前言MapperFactoryBean的工作原理底層實現剖析MapperFactoryBean的checkDaoConfig()方法總結 MapperFactoryBean的getObject()方法 思考聯想后續 系列相關相關文章究竟FactoryBean是什么?深入理解Spring的工廠神器超硬核解析Mybatis動態代理原理&#xff0…

lv12 開發板啟動過程

1 開發板啟動過程 1.1 回顧芯片手冊第三章內存映射 對于arm來說,不是給它多大的內存都能讀。尋址空間(地址空間)讀寫范圍是有限的,尋址空間的大小與地址總線寬度有關,如32位,地址空間4G(2^32)…

NVMe over Fabrics with SPDK with iRDMA總結 - 3

6.0 Configure and Test NVMe over Fabrics Host(s) to Connect to SPDK Target配置和測試 NVMe over Fabrics 主機以連接 SPDK 目標機 The SPDK NVMe-oF target system is spec compliant, which allows for the use of either an SPDK host or Linux Kernel host to co…

【C語言基礎】嵌入式面試經典題(C語言篇)----有新的內容會及時補充、更新!

📢:如果你也對機器人、人工智能感興趣,看來我們志同道合? 📢:不妨瀏覽一下我的博客主頁【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸對你有幫助,可點贊 👍…

Mac虛擬機CrossOver23破解版下載和許可證下載

CrossOver Mac Mac 和 Windows 系統之間的兼容工具。使 Mac 操作系統的用戶可以運行 Windows 系統的應用,從辦公軟件、實用工具、游戲到設計軟件, 您都可以在 Mac 程序和 Windows 程序之間隨意切換。 系統要求 運行macOS的基于Intel或Apple Silicon 的…

springboot項目加載配置文件失敗

問題 在使用springboot打成jar以后,需要文件加載一個redisson-cluster的配置文件。配置文件是在jar的同級目錄。啟動時卻總是加載jar中的配置文件,而外部配置文件卻不加載看下配置:spring:redis:redisson:# redis配置位置file: classpath:red…