簡體   English   中英

FFmpeg AVFrame到OpenGL紋理,沒有YUV到RGB軟轉換

[英]FFmpeg AVFrame to OpenGL texture without YUV to RGB soft conversion

我想在iOS上解碼加密的H264視頻文件。 我已經移植了我們的解密算法,它工作正常。 但是,由於SDK中缺少API,我們無法直接使用H264硬件解碼器。

所以我試圖找到解碼H264視頻的替代方案。 我試圖使用FFmpeg解碼這些視頻,即使有一些可能的LGPL許可證問題。 我沒有任何問題解碼H264視頻,由於OpenGL ES紋理,我渲染了H264幀。 但是存在一些性能問題。 我檢測了我的代碼,瓶頸是ffmpeg重新縮放和YUV到RGB的轉換。 我知道我可以使用OpenGL ES 2.0着色器通過GPU加速將YUV轉換為RGB(相關文章替代iOS的ffmpeg )。 我也知道如何組成AVFrame結構:Y數據的數據[0],U數據的數據[1]和V數據的數據[1]。 但我不明白如何使用數據[x]的行大小[x]來傳輸數據到OpenGL紋理。

有沒有人有一個AVFrame YUV到OpenGL紋理的例子?

謝謝,大衛

1.第一種方法是你可以使用libyuv

2.你也可以在ffmpeg libswscale.a模塊中使用sws_getCachedContextsws_scale兩個函數,像這樣將AV_PIX_FMT_YUV420P轉換為AV_PIX_FMT_0BGR32

enum AVPixelFormat dst_format = AV_PIX_FMT_0BGR32;
if (!is->img_convert_ctx)
            is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx, sourceFrame->width, sourceFrame->height, sourceFrame->format, sourceFrame->width, sourceFrame->height, dst_format, SWS_BILINEAR, NULL, NULL, NULL);
uint8_t *data[AV_NUM_DATA_POINTERS];
int linesize[AV_NUM_DATA_POINTERS];
av_image_alloc(data, linesize, sourceFrame->width, sourceFrame->height, dst_format, 1);
AVFrame *tempFrame = sourceFrame;
sws_scale(is->img_convert_ctx, (const uint8_t**) tempFrame->data, sourceFrame->linesize, 0, sourceFrame->height, data, linesize);
free(data[0]);

之后, AV_PIX_FMT_0BGR32數據在data[0]linesize[0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM