ffmpeg編程(二)


這篇主要講如何把視頻文件播放出來

如果對YUV沒有基礎的可以看下:http://www.cnblogs.com/nanguabing/archive/2012/04/12/2443485.html

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
                fprintf(stderr, "Could not initialize SDL - %s/n",
                        SDL_GetError());
                exit(1);
            }

SDL_Init()函數告訴了SDL庫,哪些特性我們將要用到,SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER分別是視頻,音頻和時間。

 

            SDL_Surface *screen;
            screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0,
                    0);
            if (!screen) {
                fprintf(stderr, "SDL: could not set video mode - exiting/n");
                exit(1);
            }

SDL_Surface是顯示圖像的容器。
函數SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0,0);來創建一個窗口,這個函數包含四個參數,依次是窗口的寬度、高度、單個像素占用位數和一個標記變量。其中第三個參數最為簡單的方法是設置為0,這樣它就為當前默認的顯示設置)。最后一個參數用SDL_HWSURFACE和SDL_DOUBLEBUF.聯起來使用要用或操作符: SDL_HWSURFACE | SDL_DOUBLEBUF。
SDL_SetVideoMode()函數不僅僅是創建了一個窗口,它還創建了一塊內存區域叫"screen buffer",用來顯示圖像。這塊區域負責顯示畫面到屏幕,標記變量SDL_HWSURFACE表示在顯存里頭創建緩存;SDL_DOUBLEBUF表示我要創建兩個緩存區域,一個用作前端緩存,這里存放的就是我們正在顯示到屏幕的內容;另一個用作后端緩存,這里存放的是我們將要顯示到屏幕上的內容。當我們顯示將要顯示的內容時候,只需要交換前端緩存和后端緩存,這樣后端緩存的內容就被顯示出來。(譯者注:也就是說前端緩存又變成了后端緩存,可以用來存放下一幅要顯示的畫面)這項技術叫做雙緩存,用來加速圖像的渲染過程。

  SDL_Overlay *bmp;
    bmp = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,
                    SDL_YV12_OVERLAY, screen);

SDL_Overlay用於存儲YUV。 

函數SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,SDL_YV12_OVERLAY, screen);負責創建YUV,參數分別是寬度,高度,YUV格式和SDL_Surface。

SDL_Rect rect;
            if (frameFinished) {
                SDL_LockYUVOverlay(bmp);
                AVPicture pict;
         //把YUV賦值給AVPicture pict.data[
0] = bmp->pixels[0]; pict.data[1] = bmp->pixels[2]; pict.data[2] = bmp->pixels[1]; pict.linesize[0] = bmp->pitches[0]; pict.linesize[1] = bmp->pitches[2]; pict.linesize[2] = bmp->pitches[1]; // Convert the image into YUV format that SDL uses img_convert(&pict, PIX_FMT_YUV420P, (AVPicture *) pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height); SDL_UnlockYUVOverlay(bmp); rect.x = 0; rect.y = 0; rect.w = pCodecCtx->width; rect.h = pCodecCtx->height; SDL_DisplayYUVOverlay(bmp, &rect); }

SDL_Rect定義了屏幕上的一個矩形區域。它被 SDL_BlitSurface() 等視頻函數用來定義貼圖區域。

 SDL_LockYUVOverlay(bmp);對YUV加鎖。

自定義函數img_convert(&pict, PIX_FMT_YUV420P, (AVPicture *) pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);負責把YUV轉換成image。

SDL_UnlockYUVOverlay(bmp);對YUV解鎖。

函數SDL_DisplayYUVOverlay(bmp, &rect);負責顯示圖片。

 

SDL_Event event;
            av_free_packet(&packet);
            SDL_PollEvent(&event);
            switch (event.type) {
            case SDL_QUIT:
                SDL_Quit();
                exit(0);
                break;
            default:
                break;
            }

 

視頻退出功能。

c文件下載

http://download.csdn.net/detail/wenwei19861106/4220091


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM