[ffmpeg] 不能正常播放視頻,播放窗口綠屏

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);


發佈了32 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章