ffmpeg開發(fā)指南(經(jīng)典)_第1頁
ffmpeg開發(fā)指南(經(jīng)典)_第2頁
ffmpeg開發(fā)指南(經(jīng)典)_第3頁
ffmpeg開發(fā)指南(經(jīng)典)_第4頁
ffmpeg開發(fā)指南(經(jīng)典)_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

#/13取視頻幀的接口。這些改變不久就會應(yīng)用到CVS中,不過這次是我第一次在發(fā)行版中看到它們。(順便感謝SilviuMinut共享長時間學習CVS版的ffmpeg的成果 他的有關(guān)ffmpeg的信息和demo程序在這里。)在這篇文章里,我僅僅會描述一下以前的版本(048)和最新版本之間的區(qū)別,所以,如果你是采用新的libavformat/libavcodec,我建議你讀前面的文章。首先,說說有關(guān)編譯新發(fā)行版吧。用我的編譯器(SuSE上的gcc331),在編譯源文件ffvl.c時會報一個編譯器內(nèi)部的錯誤。我懷疑這是個精簡版的gcc——我在編譯OpenCV時也遇到了同樣的事情一一但是不論如何,一個快速的解決方法就是在編譯此文件時不要加優(yōu)化參數(shù)。最簡單的方法就是作一個make,當編譯時遇到編譯器錯誤,進入libavcodec子目錄(因為這也是ffvl.c所在之處),在你的終端中使用gcc命令去編譯ffvlc粘貼,編輯刪除編譯器開關(guān)(譯者注:就是參數(shù))"-03",然后使用那個命令運行g(shù)cc。然后,你可以變回ffmpeg主目錄并且重新運行make,這次應(yīng)該可以編譯了。都有哪些更新?有那些更新呢?從一個程序員的角度來看,最大的變化就是盡可能的簡化了從視頻文件中讀取個人的視頻幀的操作。在ffmpegO.4.8和其早期版本中,在從一個視頻文件中的包中用例程av」ead_packet()來讀取數(shù)據(jù)時,一個視頻幀的信息通常可以包含在幾個包里,而另情況更為復(fù)雜的是,實際上兩幀之間的邊界還可以存在于兩個包之間。幸虧ffmpegO.4.9引入了新的叫做av_read_frame()的例程,它可以從一個簡單的包里返回一個視頻幀包含的所有數(shù)據(jù)。使用av_read_packet()讀取視頻數(shù)據(jù)的老辦法仍然支持,但是不贊成使用一一我說:擺脫它是可喜的。這里讓我們來看看如何使用新的API來讀取視頻數(shù)據(jù)。在我原來的文章中(與0.4.8API相關(guān)),主要的解碼循環(huán)就像下面這樣:while(GetNextFrame(pFormatCtx,pCodecCtx,videoStream,pFrame)){img_convert((AVPicture*)pFrameRGB,PIX_FMT_RGB24,(A\/Picture*)pFrame,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height);〃處理視頻幀(存盤等等)DoSomethingWithThelmage(pFrameRGB);}GetNextFrame。是個有幫助的例程,它可以處理這樣一個過程,這個過程匯編一個完整的視頻幀所需要的所有的包。新的API簡化了我們在主循環(huán)中實際直接讀取和解碼數(shù)據(jù)的操作:while(av_read_frame(pFormatCtx,&packet)>=0){〃這是視頻流中的一個包嗎?if(packet.stream_index==videoStream){〃解碼視頻流avcodec_decode_video(pCodecCtx,pFrame,&frameFinished,packet.data,packet.size);〃我們得到一幀了嗎?if(frameFinished){〃把原始圖像轉(zhuǎn)換成RGBimg_convert((AVPicture*)pFrameRGB,PIX_FMT_RGB24,(AVPicture*)pFrame,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height);〃處理視頻幀(存盤等等)DoSomethingWithThelmage(pFrameRGB);〃釋放用av_read_frame分配空間的包av_free_packet(&packet);看第一眼,似乎看上去變得更為復(fù)雜了。但那僅僅是因為這塊代碼做的都是要隱藏在GetNextFrame。例程中實現(xiàn)的(檢查包是否屬于視頻流,解碼幀并釋放包)。總的說來,因為我們能夠完全排除GetNextFrame。,事情變得更簡單了。我已經(jīng)更新了dem。程序使用最新的API。簡單比較一下行數(shù)(老版本222行Vs新版本169行)顯示出新的API大大的簡化了這件事情。0.4.9的另一個重要的更新是能夠在視頻文件中定位一個時間戳。它通過函數(shù)av_seek_frame()來實現(xiàn),此函數(shù)有三個參數(shù):一個指向AVFormatContext的指針,一個流索引和定位時間戳。此函數(shù)在給定時間戳以前會去定位第一個關(guān)鍵幀。所有這些都來自于文檔。我并沒有對av_seek_frame()進行測試,所以這里我并不能夠給出任何示例代碼。如果你成功的使用av_seek_frame(),我很高興聽到這個消息。捕獲視頻(Video4LinuxandIEEE1394)ToruTamaki發(fā)給我了一些使用libavformat/libavcodec庫從Video4Linux或者IEEE1394視頻設(shè)備源中抓捕視頻幀的樣例代碼。對Video4Linux,調(diào)用av_open_input_file()函數(shù)應(yīng)該修改如下:AVFormatParametersformatParams;AVInputFormat*iformat;formatParams.device=,7dev/videoOu;formatParams.channel=0;formatParams.standard=,,ntscN;formatParams.width=640;formatParams.height=480;formatParams.frame_rate=29;formatParams.frameratebase=1;filename=iformat=av_find_input_format(,,video4linuxH);av_open_input_file(&ffmpegFormatContext,filename,iformat,0,&formatParams);ForIEEE1394,callav_open_input_file()likethis:AVFormatParametersformatParams;AVInputFormat*iformat;formatParams.device=,7de

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論