ffmpeg在windows的編譯以及測試

來源:互聯網
上載者:User

1 :http://sourceforge.net/projects/mingw/ 去下載 mingw-get-inst-20120426.exe
安裝 ,需要連網 安裝
2 :安裝 MinGw
3:設定 環境變數 Path: MinGw的安裝路徑 bin
4:修改D:\MinGW\msys\1.0\msys.bat檔案,在開始處添加
call "D:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
5 到http://yasm.tortall.net/Download.html 這裡去下載一個可用的yasm
D:\MinGW\msys\1.0\bin
6 去 http://www.gtk.org/download/win32.php下載
GLib (Run-time) 、gettext-runtime (Run-time) 、 pkg-config (tool),
下載之後解壓它們並把解壓後得到的 *.dll和 *.exe檔案放到目錄D:\MinGW\bin下;然後重新執行./configure  --enable-shared
7 編譯 ./configure --enable-shared make make install
8 測試
#include <stdio.h>
//#include "libavformat/avformat.h"
extern "C"{

#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#ifdef _STDINT_H
#undef _STDINT_H
#endif

#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#endif

}

#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "swscale.lib")

int main()
{
//
av_register_all();
AVFormatContext* pContex = NULL;

int nRet = avformat_open_input(&pContex,"test.mp4",NULL,NULL);

if(nRet){
printf(" open mp4 file failure \n");
return -1;
}

nRet = avformat_find_stream_info(pContex,NULL);
if(nRet){
return -2;
}
AVCodecContext* pAVcodeContex = NULL;

for(int i=0;i<pContex->nb_streams;i++){
pAVcodeContex = pContex->streams[i]->codec;
if(pAVcodeContex->coder_type == AVMEDIA_TYPE_AUDIO){
break;
}
else{
//pAVcodeContex = NULL;
}
}

//printf

AVCodec* pAVCodec = avcodec_find_decoder(pAVcodeContex->codec_id);

return 0;
}

9: 編譯的時候需要把 copy MinGW\include目錄下面的stdint.h和inttypes.h
到ffmpeg\libavutil\ 目錄下編譯運行即可

參考:

http://chfj007.blog.163.com/blog/static/17314504420121144223910/

http://blog.chinaunix.net/uid-20718335-id-2980793.html

庫介紹:
  libavcodec    - 編碼解碼器
        libavdevice   - 輸入輸出裝置的支援
        libavfilter   - 視音頻濾鏡支援
        libavformat   - 視音頻等格式的解析
        libavutil     - 工具庫
        libpostproc   - 後期效果處理
        libswscale    - 映像顏色、尺寸轉換

視頻音頻資料掃盲知識:
1. 什麼是編解碼,什麼是codec?為什麼要這樣做。
答:編解碼,就是codec。CODEC =COde (編碼) +DECode(解碼)。
假設顯示器的設定是:每秒重新整理60次,也就是重新整理率為60Hz,1024 * 768的解析度,
那麼此時顯卡每秒要處理的資料量是 60 * 1024 * 768 個像素點,可想而知,視頻檔案的大小是很恐怖的。
如果不用任何方法壓縮,就單純的儲存視頻檔案,那麼1GB的檔案,也只能儲存37秒左右的視頻內容。
所以,咱們需要一個方式來壓縮(code,編碼)它,再儲存起來,要播放的時候,再解壓縮(decode,解碼)。
這樣犧牲一些時間,來換取很大一部分空間,這是值得的,並且咱們的硬體裝置也有這個能力做到。
2. 如何來編解碼呢?根據什麼前提來做呢?
答:假設一個純粹的沒壓縮過的視頻檔案,假設很大很大,他在展示給我們觀看的時候,有些內容,即使被刪去,也不會影響我們的觀看效果。舉個例子,你喝白開水的時候,裡面的礦物質元素含量多少,有或者沒有,並不影響你的口感。
所以,有些內容是不影響我們觀看感受的,所以可以刪去,那就是 
                                 編解碼的編碼器
原視頻檔案(很大) -------------------> 編碼後的視頻檔案(相對要小一些)
前後兩者在空間大小上有區別,後者小一些,當然後者的品質也要差一些。
觀看時:
                                                        編解碼的解碼器
編碼後的視頻檔案(相對要小一些)-------------------> 原視頻檔案(大) ------------->給顯卡展示。
所以,那就應該要有某一套規範來制約,那也肯定有某個配套的演算法來支援這種規範。
上面舉得這個例子是不影響我們觀看的前提下的壓縮。再舉一個例子。
平常電腦上的視頻檔案,動輒1G多一個。但是放在行動裝置上去觀看是不是有點浪費呢。
所以,也可以在影響我們觀看的前提下進行壓縮,結果就會是:你把行動裝置上的視頻檔案放在22寸顯示器上去播放,而且還全屏,你肯定看著不爽,覺得品質超差,但是這也是很有必要的。
把高清的1080P壓縮成半高清或者標清的也是一種損失品質的編碼方式。
3. 基礎概念掃盲,Container(容器),Stream(流),Frame(幀),Codec(轉碼器),mux/demux(複用/解複用)。
答:一個container就是一個檔案,一種container就是一種檔案格式,舉例:xxx.flv 和 yyy.mkv是兩個檔案,我們可以說他們是兩個容器,並且是兩種不同的容器。
    容器和流  以及  複用/解複用
    先看xxx.flv檔案,假設裡麵包含兩種stream,一種是音頻流(audio stream),另一種是視頻流(video stream),並且以flv規定的格式把這兩個流封裝在.flv容器裡面。
    再看yyy.mkv檔案,假設裡麵包含三種stream,一種是音頻流(audio stream),另一種是視頻流(video stream),還有一種流是字幕流(subtitle stream),並且以mkv規定的格式把這三種流封裝在.mkv的容器裡面。
   上面講了容器和流的關係,那把不同的流按照某種容器的規則從那種容器(檔案)中解析(或者說抽出來)出來,這種行為叫做解複用(demux),使用解複用器(demuxer),那反過來,把不同的流按照某種容器的規則放入那種容器(最後肯定產生了某種格式的檔案),這種行為叫做複用(mux),使用複用器(muxer)。
    這四個概念是抽象出來的,會有不同的結構體在實現這些抽象概念的。每個不同的容器都有不同的規則來整合流,常見的容器有,.mkv .rm .flv .mp4等等一些,那麼針對不同的容器,就應該有不同的解複用器來解複用了。其實我們也可以自己實現這些解複用器,前提是我們能夠清楚的掌握某每種容器的內部格式。
    流和幀 以及 轉碼器
    如果仔細讀了上文的話,大概也能猜到,這一段敘述的方式和上一段也會是一樣的。兩種不同的東西之間要發生轉換,肯定要有正反兩種器具,使得轉換正進行,或者反進行。
    直接了當,幀就是包含在流裡面的!
    當從容器中得到一個流以後,或者說不管你怎麼弄的,反正你得到了一個流,那這個流就認為是被某種編碼器 編碼過後產生的,你需要把這個流裡面的幀去解碼。其實這樣講是反的,我們換個角度來理解。
    什麼是影片?其實就是一組(很多張)圖片,時間間隔很小的連續展示出來,人們就覺得畫面中的人物在動,這就是影片。那電影的實質就是N多張圖片的集合。那每張圖片和幀又有什麼關係呢?事實上,如果一部影片裡面的圖片,我們原封不動的全部存起來,空間會很大很大很大,但是如果通過一定的演算法(這裡不講相關演算法),把每一張圖片壓縮(編碼_encode)一下,變成 幀。再把幀連起來變成流,再把不同的流放到某個容器裡面,這就是我們平常看見的電影檔案了,比如這個檔案 碟中諜4.H264.ACC.mkv,他為什麼要這樣命名呢? mkv表達了它的容器是.mkv的,且包含至少兩個流,h264的視頻流,ACC的音頻流。這是一種典型的
犧牲時間來換取空間的做法。
    現在應該明白了吧,回到之前的話題,得到一個流之後,就得設法找出裡面的幀,然後使用 解碼器/decoder 把幀還原,然後再去播放,也可以再去使用另一個編碼器/encoder編碼壓縮成另一種格式的幀(這就是所謂的轉格式軟體要完成的一個步驟)。
4. ffmpeg是什嗎?
    下面摘抄一段ffmpeg官網的東西。
    FFmpeg是一個開源免費跨平台的視頻和音頻流方案,屬於自由軟體,採用LGPL或GPL許可證(依據你選擇的組件)。它提供了錄製、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼品質,libavcodec裡很多codec都是從頭開發的。
5. 我們學習ffmpeg,究竟是學什麼呢?
    ffmpeg是一個方案,裡面解決了編解碼,複用解複用,裡面提供很多API給我們用,當然,還有一些工作我們必須自己完成,比如同步的問題。首先我們要瞭解從打卡一個視頻檔案到解複用到解碼到播放這一套流程,然後學習他提供的API怎麼用,使用順序是怎麼樣的。然後再去瞭解API的實現細節,最後把實現細節也掌握好了,咱們就可以按照自己的需求,進行修改,然後做一個符合需求的定製版。
6. 我試圖編譯ffmpeg的源檔案包,發現編譯出來了ffplay、ffmpeg、ffserver等等一些二進位檔案,這些是什嗎?幹什麼用的?
    ffplay:他就是一個真正的播放器了,就像vlc、mplayer等播放器,有圖形介面的。
    ffmpeg:可以理解成一個工具,利用ffmpeg方案提供的一些API,再加上一些其他動作,可以實現轉碼等一些功能。
    ffserver:顧名思義了,做伺服器的。可以單播或多播一些流

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.