Следующий фрагмент кода на основе ffmpeg строится и работает на Windows VC2012, VC20155, VC2017.
С gcc на Ubuntu LTS 16.04 это вызывает у меня проблемы, точнее, оно не распознает avcodec_send_packet , avcodec_receive_frame и struct AVCodecParameters и, возможно, больше функций и структур, которые я сейчас не использую.
ошибка: «AVCodecParameters» не был объявлен в этой области
ошибка: «avcodec_send_packet» не был объявлен в этой области
ошибка: «avcodec_receive_frame» не был объявлен в этой области
Фрагмент кода:
// the includes are actually in a precompiled header, included in cmake
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavdevice/avdevice.h>
#include <libavfilter/avfilter.h>
#include <libpostproc/postprocess.h>
#include <libswresample/swresample.h>
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#include <libavutil/avassert.h>
#include <libavutil/avstring.h>
#include <libavutil/bprint.h>
#include <libavutil/display.h>
#include <libavutil/mathematics.h>
#include <libavutil/imgutils.h>
//#include <libavutil/libm.h>
#include <libavutil/parseutils.h>
#include <libavutil/pixdesc.h>
#include <libavutil/eval.h>
#include <libavutil/dict.h>
#include <libavutil/opt.h>
#include <libavutil/cpu.h>
#include <libavutil/ffversion.h>
#include <libavutil/version.h>
}
//
...
{
if (av_read_frame(m_FormatContext, m_Packet) < 0) {
av_packet_unref(m_Packet);
m_AllPacketsSent = true;
} else {
if (m_Packet->stream_index == m_StreamIndex) {
avcodec_send_packet(m_CodecContext, m_Packet);
}
}
}
...
Я прочитал историю ffmpeg и узнал, что в системах, основанных на Debian, когда-то они следовали за форком до libavutil , а затем недавно некоторые платформы переключились обратно на ветку ffmpeg из-за того, что ffmpeg был гораздо более активно поддержан с точки зрения исправления ошибок, функций и поддержки. В результате некоторые из интерфейсов, возможно, были сломаны.
Я видел git-исправления в библиотеке под названием mediatombs, которые, похоже, сталкивались с теми же, если не очень похожими, проблемами с codecpar (которые у меня изначально были и были исправлены таким же образом):
https://github.com/gerbera/gerbera/issues/52
https://github.com/gerbera/gerbera/commit/32efd463f138557c54535225d84136df95bab3dd#diff-af3b638bc2a3e6c650974192a53c7291
Здесь коммит, кажется, решает их конкретную проблему, оборачивая поле codecpar, которое переименовывается обратно в кодек, который я также применил и работает.
Интересно, знает ли кто-нибудь, какие функции можно использовать для указанных выше ошибок, поскольку на самом деле эти функции сами заменяют устаревшие функции в соответствии с комментариями к заголовку ffmpeg avcodec.h . (https://www.ffmpeg.org/doxygen/trunk/avcodec_8h_source.html). Надеюсь, это не значит, что мне придется вернуться к avcodec_encode_video2 () типу функций?
Обновление:
Для справки, похоже, он также появился здесь: https://github.com/Motion-Project/motion/issues/338. Проблема, похоже, будет решена, если вы сможете перестроить свой стек ffmpeg.
Обновление:
Чтобы разрешить смешивание версий API, я в итоге стер с себя все ссылки на ffmpeg и пересобрал ffmpeg из исходников. Это, кажется, толкает вещи дальше в правильном направлении; Мой исходный код компилируется правильно, но все еще что-то не так с тем, как я связываю вещи вместе.
Кроме того, я использую CMake для настройки моих make-файлов, и использую find_package для некоторых зависимостей и рукописный материал find_path / find_library для всего остального. Я видел, как другие люди жалуются на следующую проблему с ссылками, и кучу ответов по конкретным случаям, но ни один из них не пролил некоторый свет на то, что является настоящей проблемой. Моя установленная версия ALSA для Ubuntu - 1.1.xx, но я все же получаю жалобы на версию 0.9, на которую якобы ссылаюсь. Кто-нибудь знает, что с этим не так?
Кроме того, мой libasound.so является символом, связанным с libasound.so.2.0.0, если это что-то проясняет. (Надеюсь, что двойной косой путь в конце также правильный)
/usr/bin/ld: /usr/lib/ffmpeg/libavdevice.a(alsa.o): undefined reference to symbol 'snd_pcm_hw_params_any@@ALSA_0.9' //usr/lib/x86_64-linux-gnu/libasound.so.2: