輕鬆使用 ffmpeg sdk 實現各種格式的rgb以及yuv raw
有些時候大家需要一些yuv或者rgb 的 raw data的檔案。ffmpeg專案中的libavcodec支援很多格式的raw相互轉換,在早期的版本中,使用 img_convert,在新版本中,使用 sws_scale 完成。各種不同的格式在ffmpeg裡面被稱為 pixel formats,下面貼出來的就是:
PIX_FMT_YUV420P, < Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples)n"
PIX_FMT_YUV422, < Packed pixel, Y0 Cb Y1 Cr n"
PIX_FMT_RGB24, < Packed pixel, 3 bytes per pixel, RGBRGB...n"
PIX_FMT_BGR24, < Packed pixel, 3 bytes per pixel, BGRBGR...n"
PIX_FMT_YUV422P, < Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples)n"
PIX_FMT_YUV444P, < Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples)n"
PIX_FMT_RGBA32, < Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endiannessn"
PIX_FMT_YUV410P, < Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples)n"
PIX_FMT_YUV411P, < Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples)n"
IX_FMT_RGB565, < always stored in cpu endianness n"
PIX_FMT_RGB555, < always stored in cpu endianness, most significant bit to 1 n"
PIX_FMT_GRAY8,n"
PIX_FMT_MONOWHITE, < 0 is white n"
PIX_FMT_MONOBLACK, < 0 is black n"
PIX_FMT_PAL8, < 8 bit with RGBA palette n"
PIX_FMT_YUVJ420P, < Planar YUV 4:2:0 full scale (jpeg)n"
PIX_FMT_YUVJ422P, < Planar YUV 4:2:2 full scale (jpeg)n"
PIX_FMT_YUVJ444P, < Planar YUV 4:4:4 full scale (jpeg)n"
PIX_FMT_UYVY422, < Packed pixel, Cb Y0 Cr Y1 n"
PIX_FMT_UYVY411, < Packed pixel, Cb Y0 Y1 Cr Y2 Y3n"
/////////////////////////////////////////////////////////////////
舉例來說,
PIX_FMT_YUV444P, < Planar YUV 4:4:4
指的是檔案的開始1/3是y分量,中間1/3是u分量,最後1/3是v分量。
PIX_FMT_RGB24, < Packed pixel, 3 bytes per pixel, RGBRGB...n"
指的是檔案內的資料3個byte是一組,始終按照RGB方式排列。
PIX_FMT_RGBA32, < Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endiannessn"
指的是檔案內的資料4個byte是一組,始終按照RGB+alpha byte方式排列,alpha表示透明度。
/////////////////////////////////////////////////////////////////
ffmpeg對於以上所有型別抽象成
typedef struct AVPicture {
uint8_t *data[4];
int linesize[4];
} AVPicture;
該結構體總共表示四個平面,
data[0]表示第一個平面的資料開始地址,
linesize[0]表示第一個平面的每一行有多少個位元組。
這樣PIX_FMT_YUV444P有三個Planar,最後一個平面空著不用就好了。
AVFrame這個結構體的包含AVPicture,此外,AVFrame還含有其他一些成員資料,比如。是否key_frame、已編碼影像數coded_picture_number、是否作為參考幀reference、宏塊型別 *mb_type等等,這裡就不詳細敘述了。
/////////////////////////////////////////////////////////////////
鑑於img_convert在新版中已經不用,所以這裡只介紹一下效率更高的。sws_scale。
來看看它的函式定義:
int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])
其中src和srcStride定義了輸入影像的四個平面的資料起始指標和四個平面中每一行包含的畫素的個數。
dst和dstStride是輸出變數,定義的是輸出影像的四個平面的資料起始指標和四個平面包含的資料的大小。
為什麼一個影像有四個平面,可以找一下YUV格式的一些詳細介紹就可以明白。
當然,RGB格式是按照緊湊格式進行編碼的,因此只有一個平面,也就是說只要設定src[0]就可以,src[1],src[2],src[3]都為NULL。
我們就在設定src[0]和srcStride[0]的地方做文章。
按照一般處理src[0]和srcStride[0]分別設定為起始影像資料的開始和影像每一行的畫素個數。
那如果把src[0] 設定為 width * ( height - 1) srcStride[0] = -height 結果會如何呢?是不是就會把影像倒過來呢?
實際確實如此。進行影像倒置的操作盡然如此簡單。這樣避免了人為再新增一次影像的反轉操作,提高了編碼的效能。
/////////////////////////////////////////////////////////////////
不發命令列工具了,需要的mail給我.
PIX_FMT_YUV420P, < Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples)n"
PIX_FMT_YUV422, < Packed pixel, Y0 Cb Y1 Cr n"
PIX_FMT_RGB24, < Packed pixel, 3 bytes per pixel, RGBRGB...n"
PIX_FMT_BGR24, < Packed pixel, 3 bytes per pixel, BGRBGR...n"
PIX_FMT_YUV422P, < Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples)n"
PIX_FMT_YUV444P, < Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples)n"
PIX_FMT_RGBA32, < Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endiannessn"
PIX_FMT_YUV410P, < Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples)n"
PIX_FMT_YUV411P, < Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples)n"
IX_FMT_RGB565, < always stored in cpu endianness n"
PIX_FMT_RGB555, < always stored in cpu endianness, most significant bit to 1 n"
PIX_FMT_GRAY8,n"
PIX_FMT_MONOWHITE, < 0 is white n"
PIX_FMT_MONOBLACK, < 0 is black n"
PIX_FMT_PAL8, < 8 bit with RGBA palette n"
PIX_FMT_YUVJ420P, < Planar YUV 4:2:0 full scale (jpeg)n"
PIX_FMT_YUVJ422P, < Planar YUV 4:2:2 full scale (jpeg)n"
PIX_FMT_YUVJ444P, < Planar YUV 4:4:4 full scale (jpeg)n"
PIX_FMT_UYVY422, < Packed pixel, Cb Y0 Cr Y1 n"
PIX_FMT_UYVY411, < Packed pixel, Cb Y0 Y1 Cr Y2 Y3n"
/////////////////////////////////////////////////////////////////
舉例來說,
PIX_FMT_YUV444P, < Planar YUV 4:4:4
指的是檔案的開始1/3是y分量,中間1/3是u分量,最後1/3是v分量。
PIX_FMT_RGB24, < Packed pixel, 3 bytes per pixel, RGBRGB...n"
指的是檔案內的資料3個byte是一組,始終按照RGB方式排列。
PIX_FMT_RGBA32, < Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endiannessn"
指的是檔案內的資料4個byte是一組,始終按照RGB+alpha byte方式排列,alpha表示透明度。
/////////////////////////////////////////////////////////////////
ffmpeg對於以上所有型別抽象成
typedef struct AVPicture {
uint8_t *data[4];
int linesize[4];
} AVPicture;
該結構體總共表示四個平面,
data[0]表示第一個平面的資料開始地址,
linesize[0]表示第一個平面的每一行有多少個位元組。
這樣PIX_FMT_YUV444P有三個Planar,最後一個平面空著不用就好了。
AVFrame這個結構體的包含AVPicture,此外,AVFrame還含有其他一些成員資料,比如。是否key_frame、已編碼影像數coded_picture_number、是否作為參考幀reference、宏塊型別 *mb_type等等,這裡就不詳細敘述了。
/////////////////////////////////////////////////////////////////
鑑於img_convert在新版中已經不用,所以這裡只介紹一下效率更高的。sws_scale。
來看看它的函式定義:
int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])
其中src和srcStride定義了輸入影像的四個平面的資料起始指標和四個平面中每一行包含的畫素的個數。
dst和dstStride是輸出變數,定義的是輸出影像的四個平面的資料起始指標和四個平面包含的資料的大小。
為什麼一個影像有四個平面,可以找一下YUV格式的一些詳細介紹就可以明白。
當然,RGB格式是按照緊湊格式進行編碼的,因此只有一個平面,也就是說只要設定src[0]就可以,src[1],src[2],src[3]都為NULL。
我們就在設定src[0]和srcStride[0]的地方做文章。
按照一般處理src[0]和srcStride[0]分別設定為起始影像資料的開始和影像每一行的畫素個數。
那如果把src[0] 設定為 width * ( height - 1) srcStride[0] = -height 結果會如何呢?是不是就會把影像倒過來呢?
實際確實如此。進行影像倒置的操作盡然如此簡單。這樣避免了人為再新增一次影像的反轉操作,提高了編碼的效能。
/////////////////////////////////////////////////////////////////
不發命令列工具了,需要的mail給我.
這裡提供一個windows平臺下使用ffmpeg的快捷方法,下面這個開發包內直接提供lib給開發人員使用。
轉自
[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1040913/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RGB2YUV 的verilog實現(RGB轉YUV)
- YUV格式到RGB格式的轉換
- Metal實現YUV轉RGB渲染視訊
- IINA for Mac:輕鬆播放和轉換各種媒體格式Mac
- 【視訊處理】YUV與RGB格式轉換
- FFmpeg開發筆記(十八)FFmpeg相容各種音訊格式的播放筆記音訊
- 微軟釋出Raw Image Extension:win10系統使用者可輕鬆訪問RAW格式微軟Win10
- 使用 CSS 輕鬆實現高頻出現的各類奇形怪狀按鈕CSS
- 輕鬆搞定分組報表中的各種排序排序
- Android 的滑動分析以及各種實現Android
- YUV420P轉換為RGB32格式
- 筆記-YUV和RGB的那些事~筆記
- 妙用WPS 輕鬆實現跨文件應用格式刷
- YUV <——> RGB 轉換演算法演算法
- yuv 到 32 位 rgb 的 快速轉換演算法基mmx 實現 (轉)演算法
- 美顏SDK介面:輕鬆實現短影片平臺差異化
- 5 種使用 Python 程式碼輕鬆實現資料視覺化的方法Python視覺化
- 不寫程式碼不用 Excel, 如何輕鬆搞定各種圖形化展現Excel
- UIButton實現各種圖文結合的效果以及原理UI
- 使用 express 輕鬆實現反向代理伺服器Express伺服器
- 輕鬆實現報表整合
- SpringBoot+mail 輕鬆實現各類郵件自動推送Spring BootAI
- Python 中一種輕鬆實現併發程式設計的方法Python程式設計
- 對接融雲即時通訊元件SDK,輕鬆實現App聊天室元件APP
- 輕鬆實現在家高效辦公
- 輕鬆實現 Web 效能優化Web優化
- 影片建立動畫GIFGIF‘ted for Mac,輕鬆製作各種小動圖動畫Mac
- 輕鬆實現session的mysql處理 (轉)SessionMySql
- Excel技巧提升:輕鬆玩轉格式Excel
- 輕鬆掌握SQL Server錯誤資訊的格式SQLServer
- 為 CameraX ImageAnalysis 進行 YUV 到 RGB 的轉換
- echart 各種圖實現
- 使用 offline-plugin 搭配 webpack 輕鬆實現 PWAPluginWeb
- 使用EasyCV Mask2Former輕鬆實現影像分割ORM
- Android 使用 CardView 輕鬆實現卡片式設計AndroidView
- 單例模式的各種實現單例模式
- CSS居中的各種實現方式CSS
- [FFmpeg]ffmpeg各類引數說明與使用示例