ffplay學習記錄02

使用SDL2.0在mac OS上渲染視頻畫面

  1. SDL下載:
    使用 SDL 來渲染視頻到屏幕。SDL 是 Simple Direct Layer 的縮寫孟抗,是一個優(yōu)秀的跨平臺多媒體庫钻心,你可以從 http://www.libsdl.org 下載 SDL 的庫捷沸。需要講SDL導入/Library/Frameworks目錄下狐史,否則在SDL編譯時會提示Image no found.

  2. SDL 渲染的相關(guān)代碼

  • 初始化
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
        fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
        exit(1);
    }
  • 創(chuàng)建一個screen,用來視頻的展示苍柏,一個texture用來加載視頻數(shù)據(jù)姜贡,一個渲染器用來渲染紋理。
//2. create window, Make a screen to put our video
    screen = SDL_CreateWindow(
                              "FFmpeg Tutorial",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              pCodecCtx->width,
                              pCodecCtx->height,
                              0
                              );
    
    if (!screen) {
        fprintf(stderr, "SDL: could not create window - exiting\n");
        exit(1);
    }
    // 3. create Render
    renderer = SDL_CreateRenderer(screen, -1, 0);
    if (!renderer) {
        fprintf(stderr, "SDL: could not create renderer - exiting\n");
        exit(1);
    }
    
    //4. create texture, Allocate a place to put our YUV image on that screen
    texture = SDL_CreateTexture(
                                renderer,
                                SDL_PIXELFORMAT_YV12,
                                SDL_TEXTUREACCESS_STREAMING,
                                pCodecCtx->width,
                                pCodecCtx->height
                                );
    if (!texture) {
        fprintf(stderr, "SDL: could not create texture - exiting\n");
        exit(1);
    }
  • YUV數(shù)據(jù)處理熄捍,SDL 創(chuàng)建紋理時使用YV12是最快的,ffmpeg 解碼出來的視頻數(shù)據(jù)默認是YUV420p余耽,需要使用sws_scale函數(shù)講420p轉(zhuǎn)化為YV12.

    SDL 的 YUV overlay 可以接收一組 YUV 數(shù)據(jù)然后顯示它。它支持 4 種不同的 YUV 格式碟贾,其中 「YV12」 是最快的袱耽。另一種 YUV 格式是 「YUV420P」也叫 「I420」,基本上和 「YV12」 是一樣的扛邑,就是把 U 和 V 數(shù)組換了一下位置。

    • YV12:亮度(行×列) + U(行×列/4) + V(行×列/4)
    • I420:亮度(行×列) + V(行×列/4) + U(行×列/4)
sws_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
                             pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
                             PIX_FMT_YUV420P,
                             SWS_BILINEAR,
                             NULL,
                             NULL,
                             NULL);
    
    // set up YV12 pixel array (12 bits per pixel)
    yPlaneSz = pCodecCtx->width * pCodecCtx->height;
    uvPlaneSz = pCodecCtx->width * pCodecCtx->height / 4;
    yPlane = (Uint8*)malloc(yPlaneSz);
    uPlane = (Uint8*)malloc(uvPlaneSz);
    vPlane = (Uint8*)malloc(uvPlaneSz);
    if (!yPlane || !uPlane || !vPlane) {
        fprintf(stderr, "Could not allocate pixel buffers - exiting\n");
        exit(1);
    }

  • 創(chuàng)建一個AVPicture,給pict賦值恶座,將解碼后的pFrame中的數(shù)據(jù)填充給pict
 AVPicture pict;
 uvPitch = pCodecCtx->width / 2;

 pict.data[0] = yPlane;
 pict.data[1] = uPlane;
 pict.data[2] = vPlane;
 pict.linesize[0] = pCodecCtx->width;
 pict.linesize[1] = uvPitch;
 pict.linesize[2] = uvPitch;
 
 // Convert the image into YUV format that SDL uses
 sws_scale(sws_ctx, (uint8_t const * const *) pFrame->data,
           pFrame->linesize, 0, pCodecCtx->height, pict.data,
           pict.linesize);

  • 將視頻數(shù)據(jù)轉(zhuǎn)化為一張紋理圖沥阳,并且在屏幕中展示出來
                // 紋理繪制
                SDL_UpdateYUVTexture(
                                     texture,
                                     NULL,
                                     yPlane,
                                     pCodecCtx->width,
                                     uPlane,
                                     uvPitch,
                                     vPlane,
                                     uvPitch
                                     );
                
                SDL_RenderClear(renderer);
                SDL_RenderCopy(renderer, texture, NULL, NULL);
                // 紋理填充到屏幕
                SDL_RenderPresent(renderer);
  • 最終的效果圖

測試代碼:https://github.com/zjunchao/ffmpeg_tutorial/tree/master/tutorial02

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脉让,一起剝皮案震驚了整個濱河市功炮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滚澜,老刑警劉巖嫁怀,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萝招,居然都是意外死亡存捺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門母赵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人师倔,你說我怎么就攤上這事周蹭。” “怎么了凶朗?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵棚愤,是天一觀的道長。 經(jīng)常有香客問我瘸洛,道長次和,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任石蔗,我火速辦了婚禮畅形,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棍厌。我一直安慰自己碍遍,他們只是感情好阳液,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著东跪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丁恭。 梳的紋絲不亂的頭發(fā)上斋日,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音第献,去河邊找鬼兔港。 笑死,一個胖子當著我的面吹牛衫樊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播载佳,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼刚盈,長吁一口氣:“原來是場噩夢啊……” “哼挂脑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崭闲,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤刁俭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牍戚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體如孝,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年锁孟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片储笑。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡突倍,死狀恐怖哑了,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弱左,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布跳夭,位于F島的核電站们镜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏模狭。R本人自食惡果不足惜嚼鹉,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匹舞。 院中可真熱鬧线脚,春花似錦、人聲如沸浑侥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽零如。三九已至,卻和暖如春祸憋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肖卧。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工蚯窥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塞帐。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓拦赠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親葵姥。 傳聞我的和親對象是個殘疾皇子荷鼠,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,654評論 0 3
  • 本文轉(zhuǎn)自:FFmpeg 入門(2):輸出視頻到屏幕 | www.samirchen.com SDL 我們這里使用 ...
    SamirChen閱讀 1,196評論 0 2
  • 貪婪而又無知的我 一瞬間就得到了世界 卻分不清哪個才是你 日月星辰同時出現(xiàn) 如何去抉擇 在我心里其實缺一不可 但我...
    BENRAY閱讀 319評論 0 0
  • 書中自有金黃屋,何苦躊躇嘆怨孤?自古文人多嘆恨榔幸,淡名泊利好覽書允乐。
    蔣光頭jL94430閱讀 315評論 8 27