使用 FFmpeg API 加载 G.729 解码器时出现问题

Posted

技术标签:

【中文标题】使用 FFmpeg API 加载 G.729 解码器时出现问题【英文标题】:Problems loading G.729 decoder with FFmpeg API 【发布时间】:2015-07-17 19:41:31 【问题描述】:

我使用 FFmpeg API 构建了一个类来解码多个音频文件(mp3、ogg、G.729 等)并将它们作为原始音频数据加载到数据结构中。现在例如当我运行以下代码时:

codec = avcodec_find_decoder(AV_CODEC_ID_G729);
if (codec == NULL)
    printf("Codec not found");
    exit(1);

程序确实会输出错误信息,但如果我加载 mp3 或 ogg 编解码器则没有问题。

所以要仔细检查我在终端ffmpeg -decoders 中执行的解码器是否受支持(我也在网上检查过)并输出:

A....D g729 G.729

我需要 G.729 的解码器。我有什么遗漏或做错了什么吗?有没有不同的方法来加载这个解码器?任何建议将不胜感激。

在Debian系统上安装的FFmpeg版本是2.7.1

API 使用示例:https://www.ffmpeg.org/doxygen/2.7/decoding_encoding_8c-example.html

【问题讨论】:

会不会是你的 ffmpeg 二进制文件和你自己的应用程序使用不同版本的 ffmpeg? 如果我从源代码编译并安装它会怎样? 无论如何都要检查一下。运行 ffmpeg 时,您应该会看到类似“ffmpeg version N-73539-gfc1800a”的行。您可以从 API 函数 av_version_info (ffmpeg.org/doxygen/trunk/…) 获得相同的信息。确保这两个值匹配。 遵循您的建议并检查了 FFmpeg 版本与 API -- 它们匹配 哇,好吧,那确实令人难以置信的混乱。我会尝试考虑其他可能导致这种情况的事情。 【参考方案1】:

好的,鉴于原始评论顺序,我尝试了我能想到的最简单的示例:

#include "libavcodec/avcodec.h"

int main() 
    avcodec_register_all();
    AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_G729);
    if (!codec) 
        fprintf(stderr, "Codec not found\n");
        exit(1);
    
    fprintf(stderr, "Codec found\n");
    return 0;

并针对我的本地 ffmpeg 树进行编译,效果很好:

$ /tmp/x
Codec found

因此,在您的具体情况下一定发生了一些奇怪的事情。您能否提供更多信息,例如您如何编译自编译的 ffmpeg 树(特别是您的配置参数,以及“grep 729 config.h”,您如何尝试运行您的作品的完整示例代码代码(它不会自行运行,因为它缺少 avcodec_register_all(),但是由于您提到了 api_example,我假设您的完整代码没有这个问题,否则 mp3/ogg 将无法工作)和编译器行用于根据您的 ffmpeg 版本编译/链接它。

【讨论】:

我从他们的仓库中获取了 Debian 软件包 FFmpeg,安装了它,并且能够从我的代码中加载编解码器。感谢您的帮助。

以上是关于使用 FFmpeg API 加载 G.729 解码器时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 设备上使用 pjsip G.729 编解码的功能

编码g.711 g.168 g.729 g.723 哪个好

FFmpeg硬件解码API介绍

FFmpeg 音频解码(秒懂)

FFmpeg硬件解码API介绍

使用 FFMpeg 将 FLV 流式传输到 RTMP,使用 H264 编解码器和 C++ API 到 flv.js