windows環境下搭建ffmpeg開發環境


       ffmpeg是一個開源、跨平台的程序庫,能夠使用在windows、linux等平台下,本文將簡單解說windows環境下ffmpeg開發環境搭建過程,本人使用的操作系統為windows 7。集成開發環境為 Visual Studio 2005,ffmpeg版本號為2.2。有人可能會說都什么年代了,還VS 2005。如今VS 2010/2012/2013都出了。本人電腦也安裝了VS2010,每次打開。伴隨着硬盤指示燈的閃爍。以及硬盤的吱吱響聲,過了許久才彈出閃屏頁面,此時你的思緒可能已經飄到了南極。啟動一次實在太慢了。全然老牛拉車的感覺,所以興許VS2012/2013就都沒有再安裝使用了。

個人認為VS2005/2008比較銳,相對輕巧些,啟動速度快,當然非常多快捷鍵用着也習慣了。

       以下從一個很easy的ffmpeg樣例着手。講一下開發環境搭建過程:
       1. 打開VS編輯器,新建一個win 32 c++控制台應用程序。
       2. 進入ffmpeg源代碼下的 doc/examples目錄。找到metadata.c文件。該文件是一個獨立demo。執行結果為打印音視頻媒體文件基本信息。該文件體積還不到2k,代碼行數在這幾個demo里最少,看起來也easy懂。

下圖為metadata.c文件源代碼。打開該文件,拷貝里面的代碼到我們新建的win 32project,此時假設嘗試編譯上述代碼時。編譯器會報各種各樣的錯誤,主要錯誤原因還是ffmpeg在windows環境下的各種水土不服。在linux環境下好非常多。沒有這么多的什么數據類型不識別、宏定義缺失等等錯誤,以下依據錯誤類型,設置project並改動上述代碼,以完畢正確編譯。

                   
       (1)設置project頭文件及lib庫依賴。

ffmpeg的頭文件和lib庫能夠自己編譯得到,只是本人沒有嘗試。而是直接到這里下載了已編譯好的ffmpeg windows相關版本號,解壓后得到下述文件:

                                             

                                             
       拷貝當中的include頭文件、lib庫文件以及bin文件夾下的dll文件到自己的project下,然后在project屬性中設置附加包括文件夾: $(ProjectDir)\include和附加庫文件夾: $(ProjectDir)\lib這個設置非常easy了。 此時project文件夾例如以下圖所看到的:
                                             
       (2)此時編譯project會有例如以下圖所看到的錯誤。解決方法就是定位到該錯誤。直接將其凝視就可以。

                                             
       (3)再次編譯project,會有例如以下圖所看到的錯誤:
                                             
定位錯誤后發現還是common.h頭文件有問題,解決方法為在剛才凝視的以下,新增下述代碼:
#ifndef  INT64_C
#define  INT64_C ( c )  ( c  # #  LL )
#define  UINT64_C ( c ) ( c  # #  ULL )
#endif
       (4)假設此時再次編譯project,還是會有錯誤,錯誤原因是我們新建的win 32 c++project直接調用ffmpeg的c函數庫,導致c函數無法解析。對於這樣因為c++和c函數名編譯后命名機制不同導致無法解析的問題。僅僅需在引用c函數庫時加入 extern   "C" 就可以,當然還有引用lib庫。改動后的代碼例如以下:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

extern "C"
{
    #include <libavformat/avformat.h>
    #include <libavutil/dict.h>
}

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

int main ()
{
    AVFormatContext *fmt_ctx = NULL;
    AVDictionaryEntry *tag = NULL;
    int ret = 0;

    av_register_all();
    if ((ret = avformat_open_input(&fmt_ctx, "iphone.mp3", NULL, NULL)))
	{
        return ret;
	}

    while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
	{
        printf("%s=%s\n", tag->key, tag->value);
	}

    avformat_close_input(&fmt_ctx);

	system("pause");
    return 0;
}
此時能夠順利編譯通過了,執行結果例如以下:
                                      
       當然,隨着開發的深入,在使用uint8_t、int64_t等數據類型時,編譯器會報例如以下錯誤: fatal error C1083: Cannot open include file: 'stdint.h': No such file or directory,即找不到相關頭文件。該頭文件的壓縮包能夠在我上傳的project文件文件夾內找到。解壓縮后將兩個頭文件拷貝至 Microsoft Visual Studio 8/ vc/include 文件夾就可以。


       project下載鏈接:http://download.csdn.net/detail/u013085897/7428719
       因為project執行依賴的幾個dll體積比較大,所以在上傳project時本人將其刪掉了,該dll能夠到文中提到的鏈接下載。即:






免責聲明!

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



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