轉(zhuǎn)載自:http://www.roarsoft.net/a/Media/AVPlay/201006/9661.html
有些時(shí)候大家需要一些yuv或者rgb 的 raw data的文件。ffmpeg項(xiàng)目中的libavcodec支持很多格式的raw相互轉(zhuǎn)換,在早期的版本中,使用 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 endianness/n"
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 Y3/n"
/////////////////////////////////////////////////////////////////
舉例來說,
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"
指的是文件內(nèi)的數(shù)據(jù)3個(gè)byte是一組,始終按照RGB方式排列。
PIX_FMT_RGBA32, < Packed pixel, 4 bytes per pixel, BGRABGRA..., stored in cpu endianness/n"
指的是文件內(nèi)的數(shù)據(jù)4個(gè)byte是一組,始終按照RGB+alpha byte方式排列,alpha表示透明度。
/////////////////////////////////////////////////////////////////
ffmpeg對(duì)于以上所有類型抽象成
typedef struct AVPicture {
uint8_t *data[4];
int linesize[4];
} AVPicture;
該結(jié)構(gòu)體總共表示四個(gè)平面,
data[0]表示第一個(gè)平面的數(shù)據(jù)開始地址,
linesize[0]表示第一個(gè)平面的每一行有多少個(gè)字節(jié)。
這樣PIX_FMT_YUV444P有三個(gè)Planar,最后一個(gè)平面空著不用就好了。
AVFrame這個(gè)結(jié)構(gòu)體的包含AVPicture,此外,AVFrame還含有其他一些成員數(shù)據(jù),比如。是否key_frame、已編碼圖像數(shù) coded_picture_number、是否作為參考幀reference、宏塊類型 *mb_type等等,這里就不詳細(xì)敘述了。
/////////////////////////////////////////////////////////////////
鑒于img_convert在新版中已經(jīng)不用,所以這里只介紹一下效率更高的。sws_scale。
來看看它的函數(shù)定義:
int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])
其中src和srcStride定義了輸入圖像的四個(gè)平面的數(shù)據(jù)起始指針和四個(gè)平面中每一行包含的像素的個(gè)數(shù)。
dst和dstStride是輸出變量,定義的是輸出圖像的四個(gè)平面的數(shù)據(jù)起始指針和四個(gè)平面包含的數(shù)據(jù)的大小。
為什么一個(gè)圖像有四個(gè)平面,可以找一下YUV格式的一些詳細(xì)介紹就可以明白。
當(dāng)然,RGB格式是按照緊湊格式進(jìn)行編碼的,因此只有一個(gè)平面,也就是說只要設(shè)置src[0]就可以,src[1],src[2],src[3]都為 NULL。
我們就在設(shè)置src[0]和srcStride[0]的地方做文章。
按照一般處理src[0]和srcStride[0]分別設(shè)置為起始圖像數(shù)據(jù)的開始和圖像每一行的像素個(gè)數(shù)。
那如果把src[0] 設(shè)置為 width * ( height - 1) srcStride[0] = -height 結(jié)果會(huì)如何呢?是不是就會(huì)把圖像倒過來呢?
實(shí)際確實(shí)如此。進(jìn)行圖像倒置的操作盡然如此簡(jiǎn)單。這樣避免了人為再添加一次圖像的反轉(zhuǎn)操作,提高了編碼的性能。
/////////////////////////////////////////////////////////////////
不發(fā)命令行工具了,需要的mail給我.
這里提供一個(gè)windows平臺(tái)下使用ffmpeg的快捷方法,下面這個(gè)開發(fā)包內(nèi)直接提供lib給開發(fā)人員使用。