我是靠谱客的博主 平常绿茶,这篇文章主要介绍FFmpeg在Linux下编译使用1.FFmpeg编译2.使用FFMPEG3.测试程序,现在分享给大家,希望可以做个参考。

1.FFmpeg编译

1.1.安装yasm

这里我是直接通过ubuntu包安装的,当然也可以通过编译源码来安装。

复制代码
1
sudo apt-get install yasm

1.2.下载FFmpeg

复制代码
1
git clone https://git.ffmpeg.org/ffmpeg.git

1.3.配置、编译FFMPEG

复制代码
1
./configure --prefix=host --enable-shared --disable-static --disable-doc

关于FFMPEG的配置参数,我们可以通过下面命令来查看

复制代码
1
./configure --help

然后执行

复制代码
1
2
make make install

就可以在host目录下找到我们需要的动态库和头文件了

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
. ├── 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 └── ffmpeg

2.使用FFMPEG

上面我们编译完了FFMPEG之后可以去运行以下bin目录下生成的可执行文件

复制代码
1
2
~/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

发现系统提示找不到动态库,可以用

复制代码
1
ldd ffmpeg

来查看运行当前可执行文件需要哪些动态库

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
~/tmp/ffmpeg/ffmpeg/host/bin$ ldd ffmpeg linux-vdso.so.1 => (0x00007fffcfeaf000) libavdevice.so.57 => not found libavfilter.so.6 => not found libavformat.so.57 => not found libavcodec.so.57 => not found libswresample.so.2 => not found libswscale.so.4 => not found libavutil.so.55 => not found libm.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)

应该有很多人和我一样,不想编译FFMPEG之后还要动自己系统的环境,这时有一个简单的方法可以解决这个问题。就是在当前终端export一个环境变量。

复制代码
1
~/tmp/ffmpeg/ffmpeg/host$ export LD_LIBRARY_PATH=lib/

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
~/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)

然后再去运行上面的可执行文件就可以了

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
~/tmp/ffmpeg/ffmpeg/host/bin$ ./ffmpeg ffmpeg version n3.2.2-8-g64bb329 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) configuration: --prefix=host --enable-shared --disable-static --disable-doc libavutil 55. 34.101 / 55. 34.101 libavcodec 57. 64.101 / 57. 64.101 libavformat 57. 56.101 / 57. 56.101 libavdevice 57. 1.100 / 57. 1.100 libavfilter 6. 65.100 / 6. 65.100 libswscale 4. 2.100 / 4. 2.100 libswresample 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.测试程序

程序可以打印出FFmpeg类库的基本信息,使用该程序通常可以验证FFmpeg是否正确的安装配置

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#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 ] %10sn", info, if_temp->name); if_temp=if_temp->next; } //Output while (of_temp != NULL){ sprintf(info, "%s[Out] %10sn", 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 %10sn", 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, "%sn", 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; }

编译方法

复制代码
1
~/tmp/ffmpeg/ffmpeg/host/test$ g++ -I ../include/ hello_world.cpp -o hello_world -L../lib/ -lavcodec -lavdevice -lavfilter -lavformat -lavutil

-I 指定头文件的搜索路径, -L指定动态库的搜索路径 -l指定要链接的动态库

 

2017/4/22:

这样编译出来的bin文件里面没有ffplay如果要生成ffplay需要下面两个步骤

1.编译SDL2

安装 libasound2-dev

复制代码
1
sudo apt-get install libasound2-dev

否则可能会报下面的错误,不能播放声音

复制代码
1
2
3
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

复制代码
1
2
3
4
5
unzip SDL2-2.0.5.zip cd SDL2-2.0.5/ ./configure --prefix=/usr/local/ make sudo make install
2.重新配置编译FFMPEG

在执行./configure是添加 --enable-ffplay

复制代码
1
2
3
./configure --prefix=host --enable-shared --disable-static --disable-doc --enable-ffplay make make install

这样就会在host/bin目录下生成ffplay了

 

2018/9/14:

ffplay 播放yuv视频

复制代码
1
ffplay -pixel_format yuva444p10le -video_size 1920x1080 test.yuv

 2018/10/22:

编译debug版ffmpeg

复制代码
1
./configure --enable-debug --enable-gpl --disable-optimizations --enable-shared --enable-static --enable-ffplay --disable-x86asm --prefix=host

调试ffmpeg时,因为make install拷贝到prefix目录的动态库是不带调试信息的,可以在/etc/ld.so.conf.d目录下添加ffmpeg.conf文件然后运行sudo ldconfig

复制代码
1
2
3
4
5
6
7
8
9
/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

 

转载于:https://www.cnblogs.com/CoderTian/p/6655568.html

最后

以上就是平常绿茶最近收集整理的关于FFmpeg在Linux下编译使用1.FFmpeg编译2.使用FFMPEG3.测试程序的全部内容,更多相关FFmpeg在Linux下编译使用1内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部