在C程序中包含ffmpeg
Including ffmpeg in C program
我正在使用 dranger 的 ffmpeg 教程:
http://dranger.com/ffmpeg/tutorial01.html
我一直在尝试编译第一个教程。我用homebrew下载了ffmpeg,但是教程中提供的编译命令没有生效:
gcc -o tutorial01 tutorial01.c -lavutil -lavformat -lavcodec -lz -lavutil -lm
根据我使用SDL的经验,我制作了一个单独的文件,只包含其中一个ffmpeg headers,并将编译命令更改为:
gcc main.c -I/usr/local/Cellar/ffmpeg/2.6.1/include
居然能编译通过。但是当我使用这个命令对教程文件进行尝试时:
gcc tutorial01.c -I/usr/local/Cellar/ffmpeg/2.6.1/include
我遇到了这些错误:
Undefined symbols for architecture x86_64:
"_av_dump_format", referenced from:
_main in tutorial01-9cd32b.o
"_av_frame_alloc", referenced from:
_main in tutorial01-9cd32b.o
"_av_frame_free", referenced from:
_main in tutorial01-9cd32b.o
"_av_free", referenced from:
_main in tutorial01-9cd32b.o
"_av_free_packet", referenced from:
_main in tutorial01-9cd32b.o
"_av_malloc", referenced from:
_main in tutorial01-9cd32b.o
"_av_read_frame", referenced from:
_main in tutorial01-9cd32b.o
"_av_register_all", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_alloc_context3", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_close", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_copy_context", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_decode_video2", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_find_decoder", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_open2", referenced from:
_main in tutorial01-9cd32b.o
"_avformat_close_input", referenced from:
_main in tutorial01-9cd32b.o
"_avformat_find_stream_info", referenced from:
_main in tutorial01-9cd32b.o
"_avformat_open_input", referenced from:
_main in tutorial01-9cd32b.o
"_avpicture_fill", referenced from:
_main in tutorial01-9cd32b.o
"_avpicture_get_size", referenced from:
_main in tutorial01-9cd32b.o
"_sws_getContext", referenced from:
_main in tutorial01-9cd32b.o
"_sws_scale", referenced from:
_main in tutorial01-9cd32b.o
我认为我必须添加教程中的额外内容,所以我做到了
gcc tutorial01.c -I/usr/local/Cellar/ffmpeg/2.6.1/include -lavutil -lavformat -lavcodec -lz -lavutil -lm
但后来我得到了这个错误
ld: library not found for -lavutil
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 1
我觉得目录 /usr/local/Cellar/ffmpeg/2.6.1/lib
可能相关,它包括文件:
libavcodec.56.26.100.dylib libavresample.dylib
libavcodec.56.dylib libavutil.54.20.100.dylib
libavcodec.a libavutil.54.dylib
libavcodec.dylib libavutil.a
libavdevice.56.4.100.dylib libavutil.dylib
libavdevice.56.dylib libpostproc.53.3.100.dylib
libavdevice.a libpostproc.53.dylib
libavdevice.dylib libpostproc.a
libavfilter.5.11.102.dylib libpostproc.dylib
libavfilter.5.dylib libswresample.1.1.100.dylib
libavfilter.a libswresample.1.dylib
libavfilter.dylib libswresample.a
libavformat.56.25.101.dylib libswresample.dylib
libavformat.56.dylib libswscale.3.1.101.dylib
libavformat.a libswscale.3.dylib
libavformat.dylib libswscale.a
libavresample.2.1.0.dylib libswscale.dylib
libavresample.2.dylib pkgconfig
libavresample.a
我经常在尝试编译下载的库时迷失方向(我花了很长时间才让 SDL 编译,当我终于让它工作时我仍然不完全明白为什么)。
如果有人能帮助我理解这些东西是如何工作的,并专门帮助我编写第一个教程,我将不胜感激。
感谢您的宝贵时间。
ffmpeg 似乎使用了 pkgconfig。所以也许你可以看看如何使用它。
http://people.freedesktop.org/~dbn/pkg-config-guide.html
简而言之:
cc `pkg-config --cflags --libs x` -o myapp myapp.c
是您必须添加到编译器调用中的内容。其中 x 是库名称(如 ffmpeg)
我正在使用 dranger 的 ffmpeg 教程:
http://dranger.com/ffmpeg/tutorial01.html
我一直在尝试编译第一个教程。我用homebrew下载了ffmpeg,但是教程中提供的编译命令没有生效:
gcc -o tutorial01 tutorial01.c -lavutil -lavformat -lavcodec -lz -lavutil -lm
根据我使用SDL的经验,我制作了一个单独的文件,只包含其中一个ffmpeg headers,并将编译命令更改为:
gcc main.c -I/usr/local/Cellar/ffmpeg/2.6.1/include
居然能编译通过。但是当我使用这个命令对教程文件进行尝试时:
gcc tutorial01.c -I/usr/local/Cellar/ffmpeg/2.6.1/include
我遇到了这些错误:
Undefined symbols for architecture x86_64:
"_av_dump_format", referenced from:
_main in tutorial01-9cd32b.o
"_av_frame_alloc", referenced from:
_main in tutorial01-9cd32b.o
"_av_frame_free", referenced from:
_main in tutorial01-9cd32b.o
"_av_free", referenced from:
_main in tutorial01-9cd32b.o
"_av_free_packet", referenced from:
_main in tutorial01-9cd32b.o
"_av_malloc", referenced from:
_main in tutorial01-9cd32b.o
"_av_read_frame", referenced from:
_main in tutorial01-9cd32b.o
"_av_register_all", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_alloc_context3", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_close", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_copy_context", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_decode_video2", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_find_decoder", referenced from:
_main in tutorial01-9cd32b.o
"_avcodec_open2", referenced from:
_main in tutorial01-9cd32b.o
"_avformat_close_input", referenced from:
_main in tutorial01-9cd32b.o
"_avformat_find_stream_info", referenced from:
_main in tutorial01-9cd32b.o
"_avformat_open_input", referenced from:
_main in tutorial01-9cd32b.o
"_avpicture_fill", referenced from:
_main in tutorial01-9cd32b.o
"_avpicture_get_size", referenced from:
_main in tutorial01-9cd32b.o
"_sws_getContext", referenced from:
_main in tutorial01-9cd32b.o
"_sws_scale", referenced from:
_main in tutorial01-9cd32b.o
我认为我必须添加教程中的额外内容,所以我做到了
gcc tutorial01.c -I/usr/local/Cellar/ffmpeg/2.6.1/include -lavutil -lavformat -lavcodec -lz -lavutil -lm
但后来我得到了这个错误
ld: library not found for -lavutil
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 1
我觉得目录 /usr/local/Cellar/ffmpeg/2.6.1/lib
可能相关,它包括文件:
libavcodec.56.26.100.dylib libavresample.dylib
libavcodec.56.dylib libavutil.54.20.100.dylib
libavcodec.a libavutil.54.dylib
libavcodec.dylib libavutil.a
libavdevice.56.4.100.dylib libavutil.dylib
libavdevice.56.dylib libpostproc.53.3.100.dylib
libavdevice.a libpostproc.53.dylib
libavdevice.dylib libpostproc.a
libavfilter.5.11.102.dylib libpostproc.dylib
libavfilter.5.dylib libswresample.1.1.100.dylib
libavfilter.a libswresample.1.dylib
libavfilter.dylib libswresample.a
libavformat.56.25.101.dylib libswresample.dylib
libavformat.56.dylib libswscale.3.1.101.dylib
libavformat.a libswscale.3.dylib
libavformat.dylib libswscale.a
libavresample.2.1.0.dylib libswscale.dylib
libavresample.2.dylib pkgconfig
libavresample.a
我经常在尝试编译下载的库时迷失方向(我花了很长时间才让 SDL 编译,当我终于让它工作时我仍然不完全明白为什么)。
如果有人能帮助我理解这些东西是如何工作的,并专门帮助我编写第一个教程,我将不胜感激。
感谢您的宝贵时间。
ffmpeg 似乎使用了 pkgconfig。所以也许你可以看看如何使用它。
http://people.freedesktop.org/~dbn/pkg-config-guide.html
简而言之:
cc `pkg-config --cflags --libs x` -o myapp myapp.c
是您必须添加到编译器调用中的内容。其中 x 是库名称(如 ffmpeg)