FFmpeg在Linux下编译使用
1.FFmpeg編譯
1.1.安裝yasm
這里我是直接通過(guò)ubuntu包安裝的,當(dāng)然也可以通過(guò)編譯源碼來(lái)安裝。
sudo apt-get install yasm1.2.下載FFmpeg
git clone https://git.ffmpeg.org/ffmpeg.git1.3.配置、編譯FFMPEG
./configure --prefix=host --enable-shared --disable-static --disable-doc關(guān)于FFMPEG的配置參數(shù),我們可以通過(guò)下面命令來(lái)查看
./configure --help然后執(zhí)行
make make install就可以在host目錄下找到我們需要的動(dòng)態(tài)庫(kù)和頭文件了
. ├── bin │ ├── ffmpeg │ ├── ffprobe │ └── ffserver ├── include │ ├── libavcodec │ ├── libavdevice │ ├── libavfilter │ ├── libavformat │ ├── libavutil │ ├── libswresample │ └── libswscale ├── lib │ ├── libavcodec.so -> libavcodec.so.57.64.101 │ ├── libavcodec.so.57 -> libavcodec.so.57.64.101 │ ├── libavcodec.so.57.64.101 │ ├── libavdevice.so -> libavdevice.so.57.1.100 │ ├── libavdevice.so.57 -> libavdevice.so.57.1.100 │ ├── libavdevice.so.57.1.100 │ ├── libavfilter.so -> libavfilter.so.6.65.100 │ ├── libavfilter.so.6 -> libavfilter.so.6.65.100 │ ├── libavfilter.so.6.65.100 │ ├── libavformat.so -> libavformat.so.57.56.101 │ ├── libavformat.so.57 -> libavformat.so.57.56.101 │ ├── libavformat.so.57.56.101 │ ├── libavutil.so -> libavutil.so.55.34.101 │ ├── libavutil.so.55 -> libavutil.so.55.34.101 │ ├── libavutil.so.55.34.101 │ ├── libswresample.so -> libswresample.so.2.3.100 │ ├── libswresample.so.2 -> libswresample.so.2.3.100 │ ├── libswresample.so.2.3.100 │ ├── libswscale.so -> libswscale.so.4.2.100 │ ├── libswscale.so.4 -> libswscale.so.4.2.100 │ ├── libswscale.so.4.2.100 │ └── pkgconfig └── share└── ffmpeg2.使用FFMPEG
上面我們編譯完了FFMPEG之后可以去運(yùn)行以下bin目錄下生成的可執(zhí)行文件
~/tmp/ffmpeg/ffmpeg/host/bin$ ./ffmpeg ./ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No such file or directory發(fā)現(xiàn)系統(tǒng)提示找不到動(dòng)態(tài)庫(kù),可以用
ldd ffmpeg來(lái)查看運(yùn)行當(dāng)前可執(zhí)行文件需要哪些動(dòng)態(tài)庫(kù)
~/tmp/ffmpeg/ffmpeg/host/bin$ ldd ffmpeg linux-vdso.so.1 => (0x00007fffcfeaf000)libavdevice.so.57 => not foundlibavfilter.so.6 => not foundlibavformat.so.57 => not foundlibavcodec.so.57 => not foundlibswresample.so.2 => not foundlibswscale.so.4 => not foundlibavutil.so.55 => not foundlibm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f41d6d9e000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f41d6b7f000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f41d67b9000)/lib64/ld-linux-x86-64.so.2 (0x00007f41d70c7000)應(yīng)該有很多人和我一樣,不想編譯FFMPEG之后還要?jiǎng)幼约合到y(tǒng)的環(huán)境,這時(shí)有一個(gè)簡(jiǎn)單的方法可以解決這個(gè)問(wèn)題。就是在當(dāng)前終端export一個(gè)環(huán)境變量。
~/tmp/ffmpeg/ffmpeg/host$ export LD_LIBRARY_PATH=lib/?
~/tmp/ffmpeg/ffmpeg/host/bin$ export LD_LIBRARY_PATH=../lib/ ~/tmp/ffmpeg/ffmpeg/host/bin$ ldd ffmpeg linux-vdso.so.1 => (0x00007fff25150000)libavdevice.so.57 => ../lib/libavdevice.so.57 (0x00007f7348cc8000)libavfilter.so.6 => ../lib/libavfilter.so.6 (0x00007f73488e8000)libavformat.so.57 => ../lib/libavformat.so.57 (0x00007f73484cc000)libavcodec.so.57 => ../lib/libavcodec.so.57 (0x00007f7347034000)libswresample.so.2 => ../lib/libswresample.so.2 (0x00007f7346e17000)libswscale.so.4 => ../lib/libswscale.so.4 (0x00007f7346b8f000)libavutil.so.55 => ../lib/libavutil.so.55 (0x00007f7346917000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f73465f1000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f73463d3000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f734600d000)libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f7345dee000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7345be9000)/lib64/ld-linux-x86-64.so.2 (0x00007f7348edb000)libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f73459e5000)libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f73457de000)然后再去運(yùn)行上面的可執(zhí)行文件就可以了
~/tmp/ffmpeg/ffmpeg/host/bin$ ./ffmpeg ffmpeg version n3.2.2-8-g64bb329 Copyright (c) 2000-2016 the FFmpeg developersbuilt with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)configuration: --prefix=host --enable-shared --disable-static --disable-doclibavutil 55. 34.101 / 55. 34.101libavcodec 57. 64.101 / 57. 64.101libavformat 57. 56.101 / 57. 56.101libavdevice 57. 1.100 / 57. 1.100libavfilter 6. 65.100 / 6. 65.100libswscale 4. 2.100 / 4. 2.100libswresample 2. 3.100 / 2. 3.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Use -h to get full help or, even better, run 'man ffmpeg'3.測(cè)試程序
程序可以打印出FFmpeg類(lèi)庫(kù)的基本信息,使用該程序通常可以驗(yàn)證FFmpeg是否正確的安裝配置
#include <stdio.h> #define __STDC_CONSTANT_MACROS #ifdef __cplusplus extern "C" { #endif #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavfilter/avfilter.h" #ifdef __cplusplus }; #endif /** * AVFormat Support Information */ char * avformatinfo(){ char *info=(char *)malloc(40000); memset(info,0,40000); av_register_all(); AVInputFormat *if_temp = av_iformat_next(NULL); AVOutputFormat *of_temp = av_oformat_next(NULL); //Input while(if_temp!=NULL){ sprintf(info, "%s[In ] %10s\n", info, if_temp->name); if_temp=if_temp->next; } //Output while (of_temp != NULL){ sprintf(info, "%s[Out] %10s\n", info, of_temp->name); of_temp = of_temp->next; } return info; } /** * AVCodec Support Information */ char * avcodecinfo() { char *info=(char *)malloc(40000); memset(info,0,40000); av_register_all(); AVCodec *c_temp = av_codec_next(NULL); while(c_temp!=NULL){ if (c_temp->decode!=NULL){ sprintf(info, "%s[Dec]", info); } else{ sprintf(info, "%s[Enc]", info); } switch (c_temp->type){ case AVMEDIA_TYPE_VIDEO: sprintf(info, "%s[Video]", info); break; case AVMEDIA_TYPE_AUDIO: sprintf(info, "%s[Audio]", info); break; default: sprintf(info, "%s[Other]", info); break; } sprintf(info, "%s %10s\n", info, c_temp->name); c_temp=c_temp->next; } return info; } /** * AVFilter Support Information */ char * avfilterinfo() { char *info=(char *)malloc(40000); memset(info,0,40000); avfilter_register_all(); AVFilter *f_temp = (AVFilter *)avfilter_next(NULL); while (f_temp != NULL){ sprintf(info, "%s[%15s]\n", info, f_temp->name); f_temp=f_temp->next; } return info; } /** * Configuration Information */ char * configurationinfo() { char *info=(char *)malloc(40000); memset(info,0,40000); av_register_all(); sprintf(info, "%s\n", avcodec_configuration()); return info; } int main(int argc, char* argv[]) { char *infostr=NULL; infostr=configurationinfo(); printf("\n<<Configuration>>\n%s",infostr); free(infostr); infostr=avformatinfo(); printf("\n<<AVFormat>>\n%s",infostr); free(infostr); infostr=avcodecinfo(); printf("\n<<AVCodec>>\n%s",infostr); free(infostr); infostr=avfilterinfo(); printf("\n<<AVFilter>>\n%s",infostr); free(infostr); return 0; }編譯方法
~/tmp/ffmpeg/ffmpeg/host/test$ g++ -I ../include/ hello_world.cpp -o hello_world -L../lib/ -lavcodec -lavdevice -lavfilter -lavformat -lavutil-I?指定頭文件的搜索路徑, -L指定動(dòng)態(tài)庫(kù)的搜索路徑 -l指定要鏈接的動(dòng)態(tài)庫(kù)
?
2017/4/22:
這樣編譯出來(lái)的bin文件里面沒(méi)有ffplay如果要生成ffplay需要下面兩個(gè)步驟
1.編譯SDL2
安裝 libasound2-dev
sudo apt-get install libasound2-dev否則可能會(huì)報(bào)下面的錯(cuò)誤,不能播放聲音
SDL_OpenAudio (2 channels, 32000 Hz): No such audio device SDL_OpenAudio (1 channels, 32000 Hz): No such audio device No more combinations to try, audio open failed下載SDL2
http://www.libsdl.org/release/SDL2-2.0.5.zip
編譯SDL2
unzip SDL2-2.0.5.zip cd SDL2-2.0.5/ ./configure --prefix=/usr/local/ make sudo make install2.重新配置編譯FFMPEG
在執(zhí)行./configure是添加?--enable-ffplay
./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay make make install這樣就會(huì)在host/bin目錄下生成ffplay了
?
2018/9/14:
ffplay 播放yuv視頻
ffplay -pixel_format yuva444p10le -video_size 1920x1080 test.yuv?2018/10/22:
編譯debug版ffmpeg
./configure --enable-debug --enable-gpl --disable-optimizations --enable-shared --enable-static --enable-ffplay --disable-x86asm --prefix=host調(diào)試ffmpeg時(shí),因?yàn)閙ake install拷貝到prefix目錄的動(dòng)態(tài)庫(kù)是不帶調(diào)試信息的,可以在/etc/ld.so.conf.d目錄下添加ffmpeg.conf文件然后運(yùn)行sudo ldconfig
/home/cent/source/ffmpeg/libavcodec /home/cent/source/ffmpeg/libavdevice /home/cent/source/ffmpeg/libavfilter /home/cent/source/ffmpeg/libavformat /home/cent/source/ffmpeg/libavresample /home/cent/source/ffmpeg/libavutil /home/cent/source/ffmpeg/libpostproc /home/cent/source/ffmpeg/libswresample /home/cent/source/ffmpeg/libswscale?
轉(zhuǎn)載于:https://www.cnblogs.com/CoderTian/p/6655568.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的FFmpeg在Linux下编译使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 渣打银行信用卡的还款期是啥时候 还款到账
- 下一篇: 恒生指数指的什么