admin管理员组

文章数量:1516870

popcorn player 使用 ffmpeg-2.3 + Linux + SDL1.2


【问题】popcorn播放视频, 播放窗口绿屏幕


【分析】dump AVFrame 图像帧(数据源) --> dump SDL_Overlay 图像帧(目标数据)


【结果】dump AVFrame 图像帧(数据源), OK;dump SDL_Overlay 图像帧(目标数据), Fail.


【原因】

错误的做法:
static int videoImage_display(VideoState *video_states, AVFrame *frame)
{
//传递AVFrame 的数据给SDL_Overlayer

//AVPicture picture;
SDL_Rect rect;
AVPicture pict = { {0}};

SDL_LockYUVOverlay(video_states->layer1);
// SDL_Overlayer的 pixels指针指向AVFrame的数据
video_states->layer1->pixels[0] = frame->data[0];
video_states->layer1->pixels[1] = frame->data[1];
video_states->layer1->pixels[2] = frame->data[2];

video_states->layer1->pitches[0] = frame->linesize[0];
video_states->layer1->pitches[1] = frame->linesize[2];
video_states->layer1->pitches[2] = frame->linesize[1];

SDL_DisplayYUVOverlay(video_states->layer1,  &rect),

正确的做法:
static int videoImage_display(VideoState *video_states, AVFrame *frame)
{
//AVPicture picture;
SDL_Rect rect;
AVPicture pict = { {0}};

SDL_LockYUVOverlay(video_states->layer1);

//video_states->layer1->pixels[0] = frame->data[0];
//video_states->layer1->pixels[1] = frame->data[1];
//video_states->layer1->pixels[2] = frame->data[2];

//video_states->layer1->pitches[0] = frame->linesize[0];
//video_states->layer1->pitches[1] = frame->linesize[2];
//video_states->layer1->pitches[2] = frame->linesize[1];

pict.data[0] = video_states->layer1->pixels[0];
pict.data[1] = video_states->layer1->pixels[2];
pict.data[2] = video_states->layer1->pixels[1];
pict.linesize[0] = video_states->layer1->pitches[0];
pict.linesize[1] = video_states->layer1->pitches[2];
pict.linesize[2] = video_states->layer1->pitches[1];

// AVFrame的数据拷贝到SDL_Overlay存放数据的内存区域
/*scale_image call sws_scale() */
scale_image(frame->data, frame->linesize,
frame->width, frame->height, frame->format,
pict.data, pict.linesize,
frame->width, frame->height, AV_PIX_FMT_YUV420P,
SWS_BICUBIC);

SDL_DisplayYUVOverlay(video_states->layer1,  &rect);


本文标签: 目标数据图像帧编程