Включение ffmpeg в программу C

Я использую учебник Dranger по ffmpeg:

http://dranger.com/ffmpeg/tutorial01.html

Я застрял, пытаясь скомпилировать первый учебник. Я скачал ffmpeg с помощью homebrew, но команда компиляции, приведенная в руководстве, не сработала:

gcc -o tutorial01 tutorial01.c -lavutil -lavformat -lavcodec -lz -lavutil -lm

Основываясь на своем опыте работы с SDL, я создал отдельный файл, который просто включал один из заголовков ffmpeg, и изменил команду компиляции на:

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, и когда я, наконец, заставил его работать, я все еще не совсем понял, почему).

Если бы кто-нибудь мог помочь мне понять, как все это работает, и, в частности, помочь мне скомпилировать этот первый учебник, я был бы чрезвычайно благодарен.

Спасибо за ваше время.


person Nick    schedule 20.03.2015    source источник
comment
trac.ffmpeg.org/wiki/Using%20libav* может содержать список обновленных руководств. , ГЛ!   -  person rogerdpack    schedule 23.03.2015


Ответы (1)


ffmpeg, похоже, использует pkgconfig. Так что, может быть, вы посмотрите, как его использовать.

http://people.freedesktop.org/~dbn/pkg-config-guide.html

Короче говоря:

cc `pkg-config --cflags --libs x` -o myapp myapp.c

это то, что вы должны добавить к вызову вашего компилятора. Где x — имя библиотеки (например, ffmpeg)

person stukat    schedule 20.03.2015
comment
Я не уверен, что я должен поставить как x, но я попробовал gcc `pkg-config --cflags --libs libavutil` tutorial01.c -o a.out. У меня ошибка /bin/sh: pkg-config: command not found. Насколько я понимаю, в библиотеке есть файл x.pc, который я нашел по адресу /usr/local/lib/pkgconfig/libavutil.pc. - person Nick; 20.03.2015
comment
Да, ты сделал это правильно. Ошибка, которую вы получаете, заключается в том, что pkgconfig не установлен на вашем компьютере. Это возможно? - person stukat; 20.03.2015
comment
Да, это так. После того, как я установил его (и сделал несколько других изменений), он заработал! Мне пришлось заменить lavutil lavformat lavcodec на libavutil libaavformat libavcodec и -lz -lm на libswscale, но он скомпилировался. Спасибо за вашу помощь, я ценю это. - person Nick; 20.03.2015