ошибка: «avcodec_send_packet» не был объявлен в этой области - PullRequest
0 голосов
/ 26 апреля 2018

Следующий фрагмент кода на основе 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: 

1 Ответ

0 голосов
/ 04 июля 2018

Таким образом, проблема заключалась в смешивании версий исходных кодов avcodec и ffmpeg, где я буду ссылаться на нужную библиотеку, но скомпилирован с неверным исходным пакетом. Я узнал, следуя предложению Andrew , чтобы проверить версии API в шапке.

Решением было, как предложено halfelf , удалить ffmpeg и avcodec, а затем вручную загрузить ствол исходного кода из последней версии репозитория ffmpeg и выполнить сборку из исходного кода. Это довольно сложный процесс, но все сработало и решило проблему компоновки.

...