以下基于ffmpeg的代码片段正在构建并在Windows VC2012,VC20155,VC2017上运行。
在Ubuntu LTS 16.04上使用gcc,这给了我一些问题,更具体地说它似乎无法识别 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的系统上,当它出现时,它们跟随fork to libavutil,然后最近由于事实,一些平台切换回ffmpeg分支ffmpeg在错误修正,功能和支持方面得到了更积极的支持。结果,一些接口可能被破坏。
我已经在一个名为mediatombs的库中看到了git修复程序,这些库似乎与codecpar(我最初也有相同的方式)解决了相同的问题(
https://github.com/gerbera/gerbera/issues/52
这里的提交似乎通过将正在重命名的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设置我的makefile,并使用find_package作为一些依赖项,并使用手写的find_path / find_library内容来处理其他所有内容。我已经看到其他人抱怨以下链接问题,以及大量特定案例的回复,但没有一个真正揭示了实际问题是什么。我安装的USA的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:
答案 0 :(得分:0)
所以问题确实是avcodec和ffmpeg源的版本混合,我将链接到正确的库,但针对错误的源包进行编译。我是按照 Andrew 的建议检查标题中的API版本发现的。
该解决方案按照 halfelf 的建议,先卸载ffmpeg和avcodec,然后从ffmpeg的最新存储库版本手动下载源主干,然后从源代码进行构建。这是一个相当大的过程,但都可以解决并解决链接问题。