linuxffmpeg編譯選項
下面的一切都是在 root 模式下進行的,可以不再 root 模式下進行
基礎環境就是編譯代碼的基礎庫,Ubuntu聯網安裝軟體很簡單,一個語句即可搞定,這里列出語句如下:
依賴庫分兩方面,參考以下網站列出的依賴庫信息,本文選擇的版本均參考於此網頁: FFmpeg依賴庫信息
首先創建 FFmpeg 代碼目錄,所有的源代碼放在這個目錄下
FFmpeg 編譯之後,即可使用。編譯生成的可執行程序在 ~/bin 目錄下
註:上面的 ./configure 配置編譯後並不能進行調試,需要如下配置.
剛才的工程可以運行,但不能debug。解決此問題,首先認定一點,生成的可執行程序中,ffmpeg 不包含調試信息,調試信息在 ffmpeg_g 中,debug 要選擇 ffmpeg_g。
另外,./config選項也是確定包含調試信息的核心,需要在config中添加:
採用以下命令重新config:
一些注意事項; 在使用 ffplay 播放生成 h264 格式的視頻時,播放速度會加快,解決方式:不要使用 FFmpeg 轉碼生成純 h264 格式的視頻,要使用一種容器包含 h264 視頻,即生成一種音視頻流格式,也就是不要生成純粹的 h264 碼流,而是生成諸如 mkv 等格式的文件。
⑵ ffmpeg 64位編譯腳本
NDK版本:android-ndk-r14b
ffmpeg版本:4.2.4 / 4.4
Ubuntu版本:15.5
#!/bin/bash
NDK=/home/linrendi/Desktop/Compile/android-ndk-r14b
PLATFORM=$NDK/platforms/android-21/arch-arm64
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
PREFIX=/home/linrendi/Desktop/ffmpeg64
CPU=armv8-a
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=android \
--disable-doc \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--arch=arm64 \
--cpu=$CPU \
--disable-asm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/aarch64-linux-android-gcc \
--nm=$TOOLCHAIN/bin/aarch64-linux-android-nm \
--disable-shared --enable-static \
--enable-small --disable-debug \
--disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-symver \
--enable-neon --enable-pthreads \
--disable-devices --disable-encoders \
--enable-hwaccels --enable-jni --enable-mediacodec \
--enable-encoder=aac \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-encoder=mjpeg \
--enable-encoder=ljpeg --enable-encoder=jpeg2000 --enable-encoder=jpegls \
--enable-muxer=mp4 --enable-muxer=mjpeg \
--enable-runtime-cpudetect \
make clean
make -j4
make install
$TOOLCHAIN/bin/aarch64-linux-android-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
libavdevice/libavdevice.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/aarch64-linux-android/4.9.x/libgcc.a
}
build_one
⑶ 如何把ffmpeg編譯進motion
FFmpeg在Windows系統下的編譯過程,分四步:
如下:
1. 配置編譯環境
2. 下載FFMPEG的代碼
3. 編譯,獲取FFMPEG庫(頭文件,lib,和DLL)
4. 在VC下配置,測試
1. 配置編譯環境
1)安裝MSys
下載文件:
bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
msysCORE-1.0.11-20080826.tar.gz
解壓msysCORE-1.0.11-20080826.tar.gz,比如解壓到X:\msys(以下內容都使用該路徑描述,X為你安裝的盤符)。
解壓bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,產生一個名為bash-3.1的目錄,在該目錄下有一個子目錄名為bin,其他的目錄不需要關心。復制bin目錄中的所有文件到D:\msys\bin,提示是否要覆蓋sh.exe的時候,選擇是。
到「D:\msys\postinstall」目錄下執行pi.bat,在出現的提示中輸入n回車後(這個不搞錯了),按任意鍵退出即可。
2)安裝MinGW
下載文件:
binutils-2.20-1-mingw32-bin.tar.gz
(binutils-2.19.1-mingw32-bin.tar.gz)
gcc-core-3.4.5-20060117-3.tar.gz
gcc-g++-3.4.5-20060117-3.tar.gz
w32api-3.13-mingw32-dev.tar.gz
mingwrt-3.16-mingw32-dev.tar.gz
(mingwrt-3.15.2-mingw32-dev.tar.gz)
mingwrt-3.16-mingw32-dll.tar.gz
(mingwrt-3.15.2-mingw32-dll.tar.gz)
把它們全部解壓到X:\msys\mingw。
3)修改「msys.bat」
用文本編輯器打開D:\msys\msys.bat,由於打算用MSVC++編譯程序,所以需要有.lib文件才能鏈接到FFmpeg的庫,這些.lib文件可以使用微軟的工具鏈中lib命令產生。為此,機器上必須已經安裝了微軟的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路徑替換成機器上vcvars32.bat實際存在的路徑,比如我的在「D:\program files\Microsoft Visual Studio 8\VC\bin」,於是就添加:
call "D:\program files\Microsoft Visual Studio 8\VC\bin"
4)系統整合
復制D:\msys\etc\fstab.sample為X:\msys\etc\fstab,用文本編輯器打開D:\msys\etc\fstab編輯。(需要使用一個支持Unix換行風格的編輯器,比如Notepad++),把下面這行:
D:/mingw /mingw
改為:
D:/msys/mingw /mingw
注意:改的這個目錄為mingw你所安裝的目錄,所以按本文來講是這個目錄。如果你安裝不目錄不同,就要改成你所安裝的目錄。
完成以上步驟,MSys+MinGW系統就配置完成了。
2. 下載FFMPEG的代碼
下載代碼的辦法由兩個,一個就是用svn 下載下來。我覺得哪怕你知道svn是啥,也不用這個方法,因為太慢了。一個文件一個文件下,最關鍵SVN對應的地址是國外,都不知道什麼才能全部下完。另外一個直接下一個代碼的壓縮包。
a) SVN下載 地址為svn://svn.ffmpeg.org/ffmpeg/trunk
b) 直接壓縮包。
首先進入 http://www.ffmpeg.org/download.html 這個是ffmpeg的官方主頁。在 選項FFmpeg SVN下,點擊full checkout 或者bare sources。這連個鏈接第一個可以通過SVN更新代碼,所以文件要大點,後面那個是純代碼。或許可以直接點擊該文件的這個兩個鏈接的一個直接得到。
(我用的是bare sources的程序)
3. 編譯,獲取FFMPEG庫(頭文件,lib,和DLL)
首先通過MSys安裝目錄下的msys.bat啟動MSys,這時會出現一個命令行窗口,它是一個運行著bash的rxvt程序,如下圖:
這是一個類似Linux的shell並且在Windows上運行,就像是在使用一個真正的Linux shell。不過使用這個shell時需要注意:
→目錄名使用正斜杠來分割,而不是Windows所使用的反斜杠(比如說要寫成"D:/ffmpeg"而不是"D:\ffmpeg")。
→盤符(例如"C:\")可以從根目錄處訪問(像這樣"/C/")。
→文件名或目錄名中如果帶有空格,必須用雙引號括起(例如這樣"/C/Program Files",帶有雙引號)。
下面切換到存放FFmpeg源代碼的目錄(假如你的代碼解壓之後的路徑是D:\ffmpeg),方法是輸入:"cd /D/ffmpeg"。
接下來要配置FFmpeg,選擇編譯時包含的庫,這里先輸入:
./configure --enable-shared --disable-static --enable-memalign-hack
--enable-memalign-hack選項是FFmpeg在Windows上編譯成功所必須指定的,待配置完成後,將回到命令提示符,看到下圖所示的畫面:
如果沒有錯誤的話,就可以"make"具有基本功能的FFmpeg了,在提示符後輸入:make。
編譯的過程將持續很長時間。如果一切正常,結束後將返回提示符,並有如下的最後編譯結束的輸出畫面:
在提示符後輸入:make install。
執行完後會生成幾個文件下在MSys目錄的local文件夾下。
4. 在VC下配置(這個指如何在VC中調用ffmpeg庫),測試
VC環境配置:(假如目錄為上圖所示)
方法當然就像其他額外庫一樣,一種是設置VC全局的Include路徑為你E:\msys\local\include,設置VC全局lib路徑為E:\msys\local\bin,增加操作系統的一個Path E:\msys\local\bin。
另一種就是設置某個工程的lib和Include的路徑。增加一個指向上面對應的地址。這個我就不是說的詳細,想必玩VC的都知道。
首先 建一個VC的控制台工程,然後把
E:\audio_video\ffmpeg\ffmpeg-0.5\libavcodec\apiexample.c(ffmpeg的存放目錄)拷貝到你建的那個工程。然後改名apiexample.cpp。編譯。你會發現缺頭文件。這個時候你需要將E:\msys\mingw \include(mingw安裝目錄下的include)的inttypes.h,stdint.h,_mingw.h三個文件拷到D:\msys \include(你ffmpeg庫的目錄下的include)。編譯還是有很多錯。
1. 需要在inttypes.h中 #define __restrict__ __restrict
2. 如果是long long 錯誤就改成__int64,(我沒有遇到這個錯誤)
3. c->time_base.den= (AVRational){1,25}; 改成 c->time_base.num = 1; c->time_base.den = 25;//
4. 最上面的頭文件定義如下:
#include <math.h> // 注意這個別忘了,不然會出現math模板的一個錯誤
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern "C"
{
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include <libavcodec\avcodec.h>
#include <libavutil\mathematics.h>
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")
}
4.1. 我的理解是在api-example.cpp頭文件中加入第4條的內容,即
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "libavformat/avformat.h" //andrew
#include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h"
其中我加了 #include "libavformat/avformat.h",如果不加就會報許多錯誤,意思是有學多變數沒有定義。我測試了加或者不加頭#include <math.h>,對編譯結果沒有影響。
5. api-example.cpp中似乎不支持強制類型轉換,如
samples = malloc(frame_size * 2 * c->channels);其實是將(void *)型轉換成(short *),於是我在malloc的前面增加了(short *)此問題得以解決。即samples = (short *)malloc(frame_size * 2 * c->channels);
6.按照網上高手的指示我在vs2005的工具->選項->VC++目錄中,包含文件一欄,加入我的include文件夾,即D:\msys\local\include
以上,你就可以在VC++中編譯ffmpeg了。
⑷ 【FFMPEG】NI Real time linux上安裝ffmpeg
由於需要在NI平台上使用ffmpeg庫,以實現網路媒體流。安裝過程與正常安裝有些許區別,記錄如下:
1. 硬體平台 NI-IC-373
2. ffmpeg 版本 ffmpeg-3.3.4
參考
/configure會報錯:pr command not found
Compile FFmpeg on Ubuntu, Debian, or Mint
參考: [FFmpeg-devel] [PATCH] Fix pkg-config detection when using a cross-prefix
註:如果需要安裝libx264支持,請參考
http://blog.csdn.net/li_wen01/article/details/62889494
http://www.cnblogs.com/gjianw217/p/3228455.html
環境變數
引用庫目錄
參考: 多線程的make
其他參考
1. FFmpeg在Linux下編譯使用
2. ffmpeg 在linux下編譯
3. FFmpeg在Linux下安裝編譯過程
4. Linux-安裝FFmpeg
其他問題
1. Ffmpeg error in linux [closed]
2. https://linuxserverguide.wordpress.com/2010/10/15/ffmpeg-error-while-loading-shared-libraries-libavdevice-so-52-cannot-open-shared-object-file/
⑸ linux下編譯ffmpeg時關於configure的問題.
你准備工作沒做好吧!!
先編譯安裝Yasm。
然後編譯安裝H.264 (也就是x264)。
再編譯安裝AAC audio encoder (fdk-aac)。
編譯安裝libmp3lame (MP3 audio encoder)。
編譯安裝libopus (Opus audio decoder and encoder)。
編譯安裝libvpx (VP8/VP9 video encoder and decoder)。
做後編譯安裝ffmpeg。
其中1-6你可以選擇編譯安裝,也可以使用源直接安裝。安裝後了再編譯安裝ffmpeg
你使用 sudo ldconfig -p |grep libx264 看看你的libx264是否正確安裝.
你編譯安裝x264的時候可以使用2中方式都安裝。
先
cd ../x264
./configure --enable-shared
make
make install
最後
cd ../x264
make distclean
./configure --enable-static
make
make install
⑹ linux下怎麼變異ffmpeg
1、下載ffmpeg。
wget http://down1.chinaunix.net/distfiles/ffmpeg-0.4.9-p20051120.tar.bz2
我是在這個網址上下載ffmpeg-0.4.9-p20051120.tar.bz2,看網上有人用的是svn下載,但是我的機子中沒有svn客戶端,然後就在網上搜索,下載了這個版本。如果利用svn可以下載ffmpeg最新的版本。
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
2、解壓
tar xvfj ffmpeg-0.4.9-p20051120.tar.bz2
得到解壓後的目錄是ffmpeg-0.4.9-p20051120,名字太長,利用mv命令改為ffmpeg
mv ffmpeg-0.4.9-p20051120.tar.bz2 ffmpeg
3、配置
./configure --enable-shared --prefix=/usr/local/ffmpeg
其中:--enable-shared 是允許其編譯產生動態庫,在以後的編程中要用到這個幾個動態庫。--prefix設置的安裝目錄。
4、編譯並安裝
make
make install
5、安裝之後在/usr/local/ffmpeg會看到有三個目錄
lib 動態鏈接庫位置
include 編程要用到頭文件
bin 執行文件所在的目錄
6、為了以後方便編程,我們把lib中的三個鏈接庫libavcodec.so libavformat.so libavutil.so復制到/usr/lib下。把include目錄下的ffmpeg目錄復制到/usr/include下。
這里我這樣復制了還是不對,-lavcodec -lavutil -lavformat的時候,提示找不到庫
然後我把 /usr/local/ffmpeg/lib 所有文件復制到 /usr/local/lib才可以的
執行bin目錄下的ffplay,可以去播放音頻或者視頻文件。例如播放1.mp3
./ffplay 1.mp3
另外,bin目錄下還有兩個文件:ffmpeg和ffserver
ffmpeg是一個很好的視頻和音頻的格式轉化工具。網上有很多它的說明文檔。如果不想生成ffserver,只要在./configure的時候加--disable-ffserver即可。
7、編程
如果寫了一個test.c文件,要包含ffmpeg的頭文件,可以這樣寫:
#include
編譯:gcc -o test test.c -lavformat -lavcodec -lavtuil (前提是有第6步的操作)
如果沒有第6部的操作,則編譯的時候如下:
gcc -o test test.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil
編譯成功之後,執行的時候還是需要動態庫的支持,還是要把那三個動態庫文件復制到/usr/lib或者/lib中,不然執行的時候會說找不到動態庫鏈接。還有一個方法可以解決這個問題,就是把/usr/local/ffmpeg/lib這個目錄加入到/etc/ld.so.config中,然後執行 ldconfig,或者重啟電腦,這樣執行的時候系統就可以從/usr/local/ffmpeg/lib這個目錄下去找這三個動態庫文件了。
以上的方式是採用動態庫編譯ffmpeg的,如果在configure的時候不加上--enable-shared的,則採用靜態鏈接的方式,不會生成那三個動態庫。同時生成的ffplay、ffmpeg的執行文件也比較的大,因為他們不需要動態庫的支持,就可以執行。但是不利於再次開發,所以我採用動態鏈接的方式。configure中還有很多的選項,可以通過./configure --help查看,也可以直接查看configure文件。這在配置的時候很重要。
⑺ linux ffmpeg 怎麼編64位
1、下載ffmpeg。
下載網址:http://www.ffmpeg.org/download.html
2、解壓縮
tar -zxvf ffmpeg-2.0.1.tar.gz
3、配置,生成Makefile
./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg
如果執行結果不對,可以根據提示信息,並查看幫助,解決問題
./configure --help
4、編譯安裝
make
make install
5、安裝之後在/usr/local/ffmpeg會看到有三個目錄
bin 執行文件目錄
lib 靜態,動態鏈接庫目錄
include 編程用到的頭文件
為了防止執行程序找不到庫文件,
可以將/usr/local/ffmpeg/lib目錄設置到LD_LIBRARY_PATH環境變數,
或者查看/usr/local/ffmpeg/lib下所有的鏈接,並在/usr/lib下建立同樣的鏈接。如下。
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so
ln -s /usr/local/ffmpeg/lib/libavcodec.so /usr/lib/libavcodec.so.55
ln -s /usr/local/ffmpeg/lib/libavdevice.so /usr/lib/libavdevice.so.55
ln -s /usr/local/ffmpeg/lib/libavfilter.so /usr/lib/libavfilter.so.3
ln -s /usr/local/ffmpeg/lib/libavformat.so /usr/lib/libavformat.so.55
ln -s /usr/local/ffmpeg/lib/libavutil.so /usr/lib/libavutil.so.52
ln -s /usr/local/ffmpeg/lib/libswresample.so /usr/lib/libswresample.so.0
ln -s /usr/local/ffmpeg/lib/libswscale.so /usr/lib/libswscale.so.2
這時就需要在/etc/ld.so.conf下面加一行/usr/local/ffmpeg/lib,保存過後ldconfig一下,
這時就需要在/etc/ld.so.conf下面加一行/usr/local/MySQL/lib,保存過後ldconfig一下,
6、編譯測試程序
gcc -o ffmpegtest ffmpegtest.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavcodec -lavtuil
7、執行程序
./ffmpegtest
或直接執行/usr/local/ffmpeg/lib目錄下的./ffmpeg進行測試。
⑻ 如何把ffmpeg編譯進motion
ffmpeg編譯
首先解壓ffmpeg-0.5.1.tar.bz2,,執行configure命令如下:
[plain] view plain
./configure --cc=arm-linux-gnueabihf-gcc --host-cc=arm-linux-gnueabihf --prefix=/home/***/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux --enable-cross-compile --arch=arm --disable-yasm
編譯:
[plain] view plain
make
出現錯誤如下:
[plain] view plain
arm-linux-gnueabihf-gcc -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I. -I"/home/***/iWork/lamobo/motion-3.2.12-arm-project/ffmpeg-0.5.1"
-D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -std=c99 -fomit-frame-pointer -g -Wdeclaration-after-statement -Wall -Wno-switch -Wdisabled-optimization
-Wpointer-arith -Wrendant-decls -Wno-pointer-sign -Wcast-qual -Wwrite-strings -Wtype-limits -Wundef -O3 -fno-math-errno -fno-signed-zeros -c -o
libavcodec/dsputil.o libavcodec/dsputil.c
/tmp/ccOmDdh7.s: Assembler messages:
/tmp/ccOmDdh7.s:51789: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9'
/tmp/ccOmDdh7.s:51790: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8'
/tmp/ccOmDdh7.s:51792: Error: thumb conditional instruction should be in IT block -- `movle r9,r7'
/tmp/ccOmDdh7.s:51794: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9'
/tmp/ccOmDdh7.s:51889: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8'
/tmp/ccOmDdh7.s:51890: Error: thumb conditional instruction should be in IT block -- `movgt r8,ip'
/tmp/ccOmDdh7.s:51892: Error: thumb conditional instruction should be in IT block -- `movle r8,r6'
/tmp/ccOmDdh7.s:51894: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8'
make: *** [libavcodec/dsputil.o] Error 1
這需要修改~/ffmpeg-0.5.1/config.mak,在OPTFLAGS(line:16)選項中添加:
[plain] view plain
-Wa,-mimplicit-it=thumb
加入這句的意思是在使用Thumb ISA指令編譯時自動產生「IT」指令。 繼續編譯,又報錯:
[plain] view plain
strip: Unable to recognise the format of the input file `ffmpeg'
這是strip沒有使用交叉編譯的版本所致,由於此時我們需要的庫文件已經編成,所以這個錯誤可以忽略不計,修改config.mak中的strip為arm-linux-gnueabihf-strip,繼續讓編譯完成
motion編譯
motion中的ffmpeg.c是對ffmpeg api的封裝,向其他模塊提供功能。如在主程序文件motion.c中
[cpp] view plain
//......
#ifdef HAVE_FFMPEG
/* FFMpeg initialization is only performed if FFMpeg support was found
* and not disabled ring the configure phase.
*/
ffmpeg_init();
#endif /* HAVE_FFMPEG */
//......
這里ffmpeg_init就是ffmpeg.c中封裝的方法:
[cpp] view plain
void ffmpeg_init()
{
motion_log(LOG_INFO, 0, "ffmpeg LIBAVCODEC_BUILD %d LIBAVFORMAT_BUILD %d", LIBAVCODEC_BUILD, LIBAVFORMAT_BUILD);
av_register_all();
#if LIBAVCODEC_BUILD > 4680
av_log_set_callback( (void *)ffmpeg_avcodec_log );
#endif
/* Copy the functions to use for the append file protocol from the standard
* file protocol.
*/
mpeg1_file_protocol.url_read = file_protocol.url_read;
mpeg1_file_protocol.url_write = file_protocol.url_write;
mpeg1_file_protocol.url_seek = file_protocol.url_seek;
mpeg1_file_protocol.url_close = file_protocol.url_close;
/* Register the append file protocol. */
#if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8)
av_register_protocol(&mpeg1_file_protocol);
#else
register_protocol(&mpeg1_file_protocol);
#endif
}
我們需要在motion的Makefile中加入對ffmpeg模塊的編譯,並且打開HAVE_FFMPEG等開關。首先執行configure如下:
[plain] view plain
./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --prefix=/home/stewart/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux
生成Makefile,在OBJ選項中添加ffmpeg.o:
[plain] view plain
OBJ = ffmpeg.o motion.o conf.o draw.o jpegutils.o $(VIDEO_OBJ) netcam.o \
netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o \
alg.o event.o picture.o rotate.o webhttpd.o \
webcam.o
在CFLAGS選項中添加-DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW的定義,加入libjpeg頭文件搜索目錄
[plain] view plain
libdir = ${prefix}/lib
incdir = ${prefix}/include
[plain] view plain
CFLAGS = -g -O2 -DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW -D_REENTRANT
-DMOTION_V4L2 -DMOTION_V4L2_OLD -DTYPE_32BIT="int" -DHAVE_BSWAP -Wall
-DVERSION=\"3.2.12\" -Dsysconfdir=\"$( sysconfdir)\"
在LIBS中加入對ffmpeg庫的支持:
[plain] view plain
LIBS = -L${libdir} -static -lavformat -lavcodec -lavutil -ljpeg -lm -lpthread
預備工作完成,make,編譯報錯:
[plain] view plain
motion.h:44:28: fatal error: linux/videodev.h: No such file or directory
compilation terminated.
由於linux-2.4以上的內核已經取消了videodev.h文件,需要安裝libv4l-dev,然後將motion.h,video.h中的
[plain] view plain
#include <linux/videodev.h>
修改為
[cpp] view plain
#include <libv4l1-videodev.h>
繼續,又報錯:
[plain] view plain
track.c: In function 『uvc_center』:
track.c:587:29: error: storage size of 『control_s』 isn』t known
track.c:589:24: error: 『V4L2_CID_PRIVATE_BASE』 undeclared (first use in this function)
track.c:589:24: note: each undeclared identifier is reported only once for each function it appears in
track.c:592:24: error: 『VIDIOC_S_CTRL』 undeclared (first use in this function)
track.c:601:31: error: storage size of 『queryctrl』 isn』t known
track.c:605:24: error: 『VIDIOC_QUERYCTRL』 undeclared (first use in this function)
track.c:601:31: warning: unused variable 『queryctrl』 [-Wunused-variable]
track.c:587:29: warning: unused variable 『control_s』 [-Wunused-variable]
track.c:636:25: error: storage size of 『control_s』 isn』t known
track.c:636:25: warning: unused variable 『control_s』 [-Wunused-variable]
track.c: In function 『uvc_move』:
track.c:724:29: error: storage size of 『control_s』 isn』t known
track.c:726:24: error: 『V4L2_CID_PRIVATE_BASE』 undeclared (first use in this function)
track.c:729:24: error: 『VIDIOC_S_CTRL』 undeclared (first use in this function)
track.c:724:29: warning: unused variable 『control_s』 [-Wunused-variable]
track.c:779:25: error: storage size of 『control_s』 isn』t known
track.c:779:25: warning: unused variable 『control_s』 [-Wunused-variable]
make: *** [track.o] Error 1
在track.c中添加:
[plain] view plain
#include <linux/videodev2.h>
繼續,報錯(怎麼還有啊?):
[plain] view plain
gcc -L/usr/local/lib -o motion motion.o conf.o draw.o jpegutils.o video.o video2.o video_common.o netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o webcam.o ffmpeg.o -lm -lpthread -ljpeg -L/usr/local/lib -lavformat -lavcodec -lavutil -lm -lz
/usr/local/lib/libavformat.a(file.o):(.data+0x60): multiple definition of `file_protocol'
ffmpeg.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
原來結構體file_protocol在libavformat.a和ffmpeg.o中重復定義了,分別打開兩個定義:
[cpp] view plain
//libavformat/file.c:85
URLProtocol file_protocol = {
"file",
file_open,
file_read,
file_write,
file_seek,
file_close,
};
[cpp] view plain
//ffmpeg.c
URLProtocol file_protocol = {
"file",
file_open,
file_read,
file_write,
file_seek,
file_close,
#if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8)
NULL,
NULL,
NULL,
#endif
};
將libavformat/file.c中的file_protocol定義注掉,重新編譯一份libavformat.a。然後繼續編譯motion,又報錯:
[plain] view plain
/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:917: undefined reference to `BZ2_bzDecompressInit'
/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:926: undefined reference to `BZ2_bzDecompress'
/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:929: undefined reference to `BZ2_bzDecompressEnd'
這個需要libbz2庫,下載地址http://www.bzip.org/downloads.html
編譯安裝libbz2後將-lbz2加入motion的Makefile的LIBS選項:
[plain] view plain
LIBS = -lpthread -ljpeg -L/usr/lib -lavformat -lavcodec -lavutil -lm -lz -lbz2
⑼ FFmpeg開發怎麼入手
您好,很感謝您對我的幫組。另外,我想編譯一套Linux上面的(具體是CentOS6.0)。但是有一點,我按網上所的流程編譯出來了,實用性不高。您編譯過Linux上面的FFmpeg嗎?可以給我一點指導嗎?謝謝。
