gpt4 book ai didi

gcc - 错误 : ‘avcodec_send_packet’ was not declared in this scope

转载 作者:行者123 更新时间:2023-12-04 23:25:36 24 4
gpt4 key购买 nike

以下基于 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 在错误修复、功能和支持方面得到了更积极的支持。结果,一些接口(interface)可能被破坏了。

我在一个名为 mediatombs 的库上看到了 git 修复程序,他们似乎遇到了与 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 来设置我的 makefile,并使用 find_package 来处理一些依赖项,并使用手写的 find_path/find_library 来处理其他所有内容。我看到其他人提示以下链接问题,以及大量针对特定案例的回复,但没有一个人真正阐明了实际问题是什么。我安装的 Ubuntu 版本的 ALSA 是 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: 

最佳答案

所以问题确实是 avcodec 和 ffmpeg 源的版本混合,我将链接到正确的库但针对错误的源包编译。我是通过遵循 Andrew 的建议来检查标题中的 API 版本而发现的。

正如halfelf 建议的那样,解决方案是卸载ffmpeg 和avcodec,然后从ffmpeg 的最新存储库版本手动下载源主干,并从源代码构建。这是一个相当大的过程,但一切都解决了并解决了链接问题。

关于gcc - 错误 : ‘avcodec_send_packet’ was not declared in this scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50040531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com