日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ffmpeg文档2:输出到屏幕

發布時間:2023/12/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ffmpeg文档2:输出到屏幕 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SDL和視頻

為了在屏幕上顯示,我們將使用SDL.SDL是Simple Direct Layer的縮寫。它是一個出色的多媒體庫,適用于多平臺,并且被用在許多工程中。你可以從它的官方網站的網址 http://www.libsdl.org/上來得到這個庫的源代碼或者如果有可能的話你可以直接下載開發包到你的操作系統中。按照這個指導,你將需要編譯這個庫。(剩下的幾個指導中也是一樣)

SDL庫中有許多種方式來在屏幕上繪制圖形,而且它有一個特殊的方式來在屏幕上顯示圖像――這種方式叫做YUV覆蓋。YUV(從技術上來講并不叫YUV而是叫做YCbCr)是一種類似于RGB方式的存儲原始圖像的格式。粗略的講,Y是亮度分量,U和V是色度分量。(這種格式比RGB復雜的多,因為很多的顏色信息被丟棄了,而且你可以每2個Y有1個U和1個V)。SDL的YUV覆蓋使用一組原始的YUV數據并且在屏幕上顯示出他們。它可以允許4種不同的 YUV格式,但是其中的YV12是最快的一種。還有一個叫做YUV420P的YUV格式,它和YV12是一樣的,除了U和V分量的位置被調換了以外。 420意味著它以4:2:0的比例進行了二次抽樣,基本上就意味著1個顏色分量對應著4個亮度分量。所以它的色度信息只有原來的1/4。這是一種節省帶寬的好方式,因為人眼感覺不到這種變化。在名稱中的P表示這種格式是平面的――簡單的說就是Y,U和V分量分別在不同的數組中。FFMPEG可以把圖像格式轉換為YUV420P,但是現在很多視頻流的格式已經是YUV420P的了或者可以被很容易的轉換成YUV420P格式。

于是,我們現在計劃把指導1中的SaveFrame()函數替換掉,讓它直接輸出我們的幀到屏幕上去。但一開始我們必需要先看一下如何使用SDL庫。首先我們必需先包含SDL庫的頭文件并且初始化它。

#include <SDL.h>

#include <SDL_thread.h>

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_GetError()是一個用來手工除錯的函數。

創建一個顯示

現在我們需要在屏幕上的一個地方放上一些東西。在SDL中顯示圖像的基本區域叫做面surface。

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

}

這就創建了一個給定高度和寬度的屏幕。下一個選項是屏幕的顏色深度――0表示使用和當前一樣的深度。(這個在OS X系統上不能正常工作,原因請看源代碼)

現在我們在屏幕上來創建一個YUV覆蓋以便于我們輸入視頻上去:

SDL_Overlay *bmp;

bmp = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,

SDL_YV12_OVERLAY, screen);

正如前面我們所說的,我們使用YV12來顯示圖像。

顯示圖像

前面那些都是很簡單的。現在我們需要來顯示圖像。讓我們看一下是如何來處理完成后的幀的。我們將原來對RGB處理的方式,并且替換SaveFrame() 為顯示到屏幕上的代碼。為了顯示到屏幕上,我們將先建立一個AVPicture結構體并且設置其數據指針和行尺寸來為我們的YUV覆蓋服務:

if(frameFinished) {

SDL_LockYUVOverlay(bmp);

AVPicture pict;

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

}

首先,我們鎖定這個覆蓋,因為我們將要去改寫它。這是一個避免以后發生問題的好習慣。正如前面所示的,這個AVPicture結構體有一個數據指針指向一個有4個元素的指針數據。由于我們處理的是YUV420P,所以我們只需要3個通道即只要三組數據。其它的格式可能需要第四個指針來表示alpha通道或者其它參數。行尺寸正如它的名字表示的意義一樣。在YUV覆蓋中相同功能的結構體是像素pixel和程度pitch。(程度pitch是在SDL里用來表示指定行數據寬度的值)。所以我們現在做的是讓我們的覆蓋中的pict.data中的三個指針有一個指向必要的空間的地址。類似的,我們可以直接從覆蓋中得到行尺寸信息。像前面一樣我們使用img_convert來把格式轉換成PIX_FMT_YUV420P。

繪制圖像

但我們仍然需要告訴SDL如何來實際顯示我們給的數據。我們也會傳遞一個表明電影位置、寬度、高度和縮放大小的矩形參數給SDL的函數。這樣,SDL為我們做縮放并且它可以通過顯卡的幫忙來進行快速縮放。

SDL_Rect rect;

if(frameFinished) {

// 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的特性:它的事件驅動系統。SDL被設置成當你在SDL中點擊或者移動鼠標或者向它發送一個信號它都將產生一個事件的驅動方式。如果你的程序想要處理用戶輸入的話,它就會檢測這些事件。你的程序也可以產生事件并且傳遞給SDL事件系統。當使用SDL進行多線程編程的時候,這相當有用,這方面代碼我們可以在指導4中看到。在這個程序中,我們將在處理完包以后就立即輪詢事件。現在而言,我們將處理SDL_QUIT事件以便于我們退出:

SDL_Event event;

av_free_packet(&packet);

SDL_PollEvent(&event);

switch(event.type) {

case SDL_QUIT:

SDL_Quit();

exit(0);

break;

default:

break;

}

讓我們去掉舊的冗余代碼,開始編譯。如果你使用的是Linux或者其變體,使用SDL庫進行編譯的最好方式為:

gcc -o tutorial02 tutorial02.c -lavutil -lavformat -lavcodec -lz -lm \

`sdl-config –cflags –libs`

這里的sdl-config命令會打印出用于gcc編譯的包含正確SDL庫的適當參數。為了進行編譯,在你自己的平臺你可能需要做的有點不同:請查閱一下SDL文檔中關于你的系統的那部分。一旦可以編譯,就馬上運行它。

當運行這個程序的時候會發生什么呢?電影簡直跑瘋了!實際上,我們只是以我們能從文件中解碼幀的最快速度顯示了所有的電影的幀。現在我們沒有任何代碼來計算出我們什么時候需要顯示電影的幀。最后(在指導5),我們將花足夠的時間來探討同步問題。但一開始我們會先忽略這個,因為我們有更加重要的事情要處理:音頻!

總結

以上是生活随笔為你收集整理的ffmpeg文档2:输出到屏幕的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产粉嫩一区二区三区 | 手机看片国产精品 | 亚洲国产97在线精品一区 | 午夜视频福利在线 | 国产精品一区二区三 | 欧美日韩精品一区二区三区 | 瑟瑟在线视频 | 色女综合| 风间由美在线视频 | 成人啪啪网站 | 乌克兰黄色片 | 俺也去网站 | 精品久久在线 | 草女人视频 | 一本一道无码中文字幕精品热 | 美女bb视频| 亚洲天堂网站 | 亚洲激情另类 | 国产精品99久久 | 国产精品一区二区三区四区在线观看 | 狠狠干男人的天堂 | 亚洲综合中文 | 91美女在线观看 | 久久嗨 | 国产良妇出轨视频在线观看 | 最近中文字幕在线中文视频 | 男女性高潮免费网站 | 最新中文字幕在线观看 | 久久福利影院 | 亚洲色图欧美日韩 | 亚洲色精品三区二区一区 | 69视频免费 | 国产精品亚洲视频 | 熟女人妻aⅴ一区二区三区60路 | 色多多视频网站 | 欧美一区影院 | 爽好多水快深点欧美视频 | 久草久热| 日本黄色一级视频 | 日韩欧美国产另类 | 神宫寺奈绪一区二区三区 | 国产v综合v亚洲欧美久久 | 国产在线毛片 | 美女视频91 | 婷婷的五月天 | 亚洲区色 | 中文字幕狠狠 | 毛片.com| 亚洲1页 | 欧美不卡视频在线观看 | 国产一区综合 | 中国女人内谢69xxxxⅹ视频 | 91伦理| 国产色视频网站 | 好看的av网址 | 五月婷婷六月丁香综合 | 色偷偷影院| 欧美交换 | 国产精品人人爽 | 黄色免费观看网站 | 午夜精品久久久久久久蜜桃 | 鬼灭之刃柱训练篇在线观看 | 青草视频在线观看视频 | h片在线免费观看 | 亚洲va韩国va欧美va | 制服.丝袜.亚洲.中文.综合 | 在线观看av资源 | xx性欧美肥妇精品久久久久久 | 国产精品中文 | av小次郎收藏 | 亚洲国产精品视频一区 | 4色av| www.97ai.com | 亚洲成人精品视频 | 成人av无码一区二区三区 | 日本欧美视频 | 私密spa按摩按到高潮 | 天天摸夜夜 | 国产香蕉网 | 精品人伦一区二区三区 | 超碰在线人人干 | 综合性色 | 亚洲成a| 无码人妻精品一区二区三区在线 | 91av国产视频 | 大乳女喂男人吃奶 | 一区二区三区四区高清视频 | 久久成人福利视频 | 久久久在线 | 国产一区亚洲二区三区 | 在线观看911视频 | 日韩精品中文字幕一区二区三区 | 欧美丰满老熟妇xxxxx性 | 91视频 - 88av | 51av在线| 免费看一级一片 | 久久国产色av| 你懂的91 | 美日韩一区二区三区 |