FFmpeg解码出来avframe,但显示很容易出现乱码,因为为了计算的方便,ffmpeg解码出来的数据,总视根据系统处理器或者系统来补齐为 64、32、16的倍数。这也是我们显示乱码的问题所在。
问题
比如我显示抖音上的视频的宽为368x640, 解码的帧率avFrame,下面是avframe的一些成员变量:
avFrame->format = 0 // 表示是 yuv420p的数据格式
avFrame->width = 364
avFrame->height= 640
然后取数据的时候,
y= avFrame->data[0]
u= avFrame->data[1]
v= avFrame->data[2]
将yuv给opengl渲染就会乱码。
解决方法
将宽度设置为linesize
直接获得data[0]的数据,在创建显示texture的时候以,avFrame-linesize[0]作为一帧的宽度:
// 直接按照填补的 宽度来显示,效率最高,若视频宽度不是64/32(根据系统位数)倍数,右边会存在边框。
int w = avFrame->linesize[0];
int h = avFrame->height;
unsigned char * y = avFrame->data[0];
unsigned char * u = avFrame->data[1] ;
unsigned char * v = avFrame->data[2];
glProgram->Draw(w,h,y,u