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執行依賴的幾個dll體積比較大,所以在上傳project時本人將其刪掉了,該dll能夠到文中提到的鏈接下載。即:
