![](/img/trans.png)
[英]ffmpeg ios: Getting frame to UIImage, failing at YUV420 to RGB conversion
[英]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_getCachedContext
和sws_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.