使用 avcodec_decode_audio4() 解码 AAC 时出错

2023-11-30

我尝试使用 FFmpeg 本机解码器解码 AAC 并遇到错误

SSR is not implemeted. Update your FFmpeg version to newest from Git. If the      problem still occurs, it mean that your file has a feature which has not implemented.

功能avcodec_decode_audio4()返回-1163346256。这是因为 FFmpeg 版本吗?我从下载了共享版和开发版here。这是最新的吗?

这是源代码:

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"

extern "C" 
{
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <libavcodec\avcodec.h>
#include <libavformat/avformat.h>
}

// compatibility with newer API
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
#define av_frame_alloc avcodec_alloc_frame
#define av_frame_free avcodec_free_frame
#endif

#define AUDIO_INBUF_SIZE 20480
#define AUDIO_REFILL_THRESH 4096


static void audio_decode_example(const char *outfilename, const char *filename);


int main(int argc, char *argv[]) {
    audio_decode_example("D:\\sample.pcm","D:\\sample.m4a");
    getch();
    return 0;
}


/*
 * Audio decoding.
 */
static void audio_decode_example(const char *outfilename, const char *filename)
{
    AVCodec *codec;
    AVFormatContext   *pFormatCtx = NULL;
    AVCodecContext    *pCodecCtxOrig = NULL;
    AVCodecContext * pCodecCtx= NULL;
    int len;
    FILE *f, *outfile;
    uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
    AVPacket avpkt;
    AVFrame *decoded_frame = NULL;


    av_register_all();

    av_init_packet(&avpkt);

    printf("Decode audio file %s to %s\n", filename, outfilename);

    // Open file to get format context
    if(avformat_open_input(&pFormatCtx, filename, NULL, NULL)!=0){
        printf("Couldn't open file");
        return; // Couldn't open file
    }

    // Retrieve stream information
    if(avformat_find_stream_info(pFormatCtx, NULL)<0){
        printf("Couldn't find stream information");
        return; // Couldn't find stream information
    }

    // Dump information about file onto standard error
    av_dump_format(pFormatCtx, 0, filename, 0);

    // Find the first audio stream
    int audioStream = -1;
    int i =0;
    for(i=0; i<pFormatCtx->nb_streams; i++) {
        if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
            audioStream=i;
            break;
        }
    }

    if(audioStream==-1) {
        printf("Didn't find a audio stream");
        return; // Didn't find a audio stream
    }

    // Get a pointer to the codec context for the audio stream
    pCodecCtxOrig=pFormatCtx->streams[audioStream]->codec;

    // Find the decoder for the audio stream
    codec=avcodec_find_decoder(pCodecCtxOrig->codec_id);
    if(codec==NULL) {
        fprintf(stderr, "Codec not found\n");
        return; // Codec not found
    }

    pCodecCtx = avcodec_alloc_context3(codec);
    if (!pCodecCtx) {
        fprintf(stderr, "Could not allocate audio codec context\n");
        return;
    }

    if(avcodec_copy_context(pCodecCtx, pCodecCtxOrig) != 0) {
        fprintf(stderr, "Couldn't copy codec context");
        return; // Error copying codec context
    }


    /* open it */
    if (avcodec_open2(pCodecCtx, codec, NULL) < 0) {
        fprintf(stderr, "Could not open codec\n");
        return;
    }

    f = fopen(filename, "rb");
    if (!f) {
        fprintf(stderr, "Could not open %s\n", filename);
        return;
    }
    outfile = fopen(outfilename, "wb");
    if (!outfile) {
        av_free(pCodecCtx);
        return;
    }

    /* decode until eof */
    avpkt.data = inbuf;
    avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);

    while (avpkt.size > 0) {
        int i, ch;
        int got_frame = 0;

        if (!decoded_frame) {
            if (!(decoded_frame = av_frame_alloc())) {
                fprintf(stderr, "Could not allocate audio frame\n");
                return;
            }
        }

        len = avcodec_decode_audio4(pCodecCtx, decoded_frame, &got_frame, &avpkt);
        if (len < 0) {
            fprintf(stderr, "Error while decoding. len = %d \n",len);
            return;
        }
        if (got_frame) {
            /* if a frame has been decoded, output it */
            int data_size = av_get_bytes_per_sample(pCodecCtx->sample_fmt);
            if (data_size < 0) {
                /* This should not occur, checking just for paranoia */
                fprintf(stderr, "Failed to calculate data size\n");
                return;
            }
            for (i=0; i < decoded_frame->nb_samples; i++)
                for (ch=0; ch < pCodecCtx->channels; ch++)
                    fwrite(decoded_frame->data[ch] + data_size*i, 1, data_size, outfile);
        }
        avpkt.size -= len;
        avpkt.data += len;
        avpkt.dts =
        avpkt.pts = AV_NOPTS_VALUE;
        if (avpkt.size < AUDIO_REFILL_THRESH) {
            /* Refill the input buffer, to avoid trying to decode
             * incomplete frames. Instead of this, one could also use
             * a parser, or use a proper container format through
             * libavformat. */
            memmove(inbuf, avpkt.data, avpkt.size);
            avpkt.data = inbuf;
            len = fread(avpkt.data + avpkt.size, 1,
                        AUDIO_INBUF_SIZE - avpkt.size, f);
            if (len > 0)
                avpkt.size += len;
        }
    }

    fclose(outfile);
    fclose(f);

    avcodec_close(pCodecCtx);
    av_free(pCodecCtx);
    av_frame_free(&decoded_frame);
}

我也读过这个问题:如何使用avcodec_decode_audio4解码AAC?但没有提供解决方案。


f = fopen(filename, "rb");
if (!f) {
    fprintf(stderr, "Could not open %s\n", filename);
    return;
}
outfile = fopen(outfilename, "wb");
if (!outfile) {
    av_free(pCodecCtx);
    return;
}

/* decode until eof */
avpkt.data = inbuf;
avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);

while (avpkt.size > 0) {
    int i, ch;
    int got_frame = 0;

是的,那是行不通的。您无法将某些随机复用格式(可能是 mp4)中的原始字节转储到解码器中并期望它能够工作。使用av_read_frame() 从复用格式中读取各个音频数据包,并使用 avcodec_decode_audio4() 将生成的 AVPacket 馈送到解码器中。参见例如这德兰格 API 教程。我知道 api-example.c 使用上面的代码,但不幸的是,这只适用于非常有限的情况子集。另请参阅中的详细说明API docs.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 avcodec_decode_audio4() 解码 AAC 时出错 的相关文章

  • 在哪里使用 EF6 订阅 ObjectMaterialized?

    我正在尝试将我的上下文订阅到以下 OnjectMaterialized 事件this https stackoverflow com a 3756842 2835713 像这样 IObjectContextAdapter this Obje
  • 数据结构的优化存储以实现快速查找和持久化

    Scenario 我有以下方法 public void AddItemSecurity int itemId int userIds public int GetValidItemIds int userId 最初我正在考虑表单上的存储 i
  • ASP.NET 会员电子邮件验证

    尝试基于 C 创建电子邮件验证本文 https web archive org web 20211020153319 https www 4guysfromrolla com articles 062508 1 aspx 我创建了一个 ja
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • MVC 中的 Blazor:组件被渲染,但 @onclick 不起作用。连接问题

    我正在尝试在 net core 3 MVC 项目中使用 Blazor 我使用了一些教程来做到这一点 例如https fizzylogic nl 2019 08 18 integrating blazor in an existing asp
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 二维数组的列求和

    我有一个IEnumerable
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • 当用户名错误时,为什么 GetErrorMessage 返回“密码错误”?

    获取错误消息 来自 CInternetException 给了我以下内容 FTP 服务器名称不正确 错误 无法解析服务器名称或地址 密码错误 错误 密码不被允许 用户名不正确 错误 密码不被允许 try pConnect sess gt G
  • 有效地将命名列表转换为 data.frame [重复]

    这个问题在这里已经有答案了 我正在寻找一种有效的方法来进行以下转换 输入示例 ob lt list a 2 b 3 预期输出 key value 1 a 2 2 b 3 当前 详细 解决方案 data frame key names ob
  • JavaScript 中 const 和 const {} 有什么区别?

    当我学习时Electron 我发现了两种获取 BrowserWindow 对象的方法 const BrowserWindow require electron and const electron require electron cons
  • 文件打开、文件读取、文件写入

    如何正确使用文件读取 文件写入 缓冲区 或 TFileStream 我需要将整个文本文件读取到字符串中 然后将字符串写回到该文件中 用新字符串替换它 TStringList如果您需要按行处理文件 这就是您想要的 如果您只想将其视为单个字符串
  • 为什么 termcolor 在 Windows 控制台中输出控制字符而不是彩色文本?

    我刚刚安装术语颜色适用于 Windows 上的 Python 2 7 当我尝试打印彩色文本时 我得到的是颜色代码 from termcolor import colored print colored Text text text red
  • 刷新页面上的Javascript而不刷新HTML

    关于我的问题的一些背景信息 我正在更新当前显示 HTML 的 div 中的 MathML 当我第一次加载页面时 如果运行 MathJax 脚本并完美显示所有 MathML 当我单击 预览更改 一个按钮 该按钮获取文本区域中所做的当前更改并将
  • Flutter的全球主流飞镖未来如何等待?

    我使用 dart meteor 包 并且必须在全球范围内发起main dart 像这样 import package flutter material dart import package dart meteor dart meteor
  • PHP include() 在 doctype 之前,导致空格

    我的网站存在空白问题 我在文档类型之前包含了一些文件 这会导致输出空白 经过搜索我找到了这个解决方案 文档类型前的空格问题 然而去掉之后 gt 我仍然遇到问题 下面是代码 Here is session php
  • 正则表达式匹配科学记数法

    我正在尝试匹配科学记数法中的数字 正则表达式来自here scinot re compile 0 1 9 d d eE d re findall scinot x 1e4 1e4 re findall scinot x c1e4 1e4 我
  • 如何持续监控LogCat文件?

    我需要以某种方式监视 LogCat 日志 这意味着当我的服务运行时 我需要读取 LogCat 中的新条目 目前我只知道如何检索一次日志 Process mLogcatProc null BufferedReader reader null
  • 获取内核代码中的当前工作目录

    我正在开发一个项目 在该项目中我需要知道调用系统调用的可执行文件的当前工作目录 我认为这是可能的 因为某些系统调用就像open将利用该信息 您能告诉我如何获取字符串中的当前工作目录路径吗 你可以看看如何getcwd系统调用的实现是为了看看如
  • itext 马拉地语(印度)语言显示问题

    我正在评估 iText 作为 java swing 应用程序的 PDFGenerator 输出应该是 马拉地语 这是一种与印地语类似但不相同的印度当地语言 出于评估目的 这是我要打印的文本 这是源代码 package pdftest imp
  • 为什么这个iPhone程序不调用-loadView?

    我正在尝试完成基本的 iPhone 编程 并且我对 Interface Builder 的工作原理有很好的基本了解 因此我决定尝试以编程方式制作视图 我已经浏览了 ViewController Apple 指南并到处搜索 但似乎找不到解决我
  • 找不到模块:错误无法解析“child_process”,如何修复?

    我正在尝试创建一个 JupyterLab 扩展 它使用打字稿 我已经成功添加了包 types node 允许我使用 require http 等包 但是 一旦我尝试使用子进程 使用 require child process 我在尝试构建扩
  • Android Studio渲染错误

    所以我只是尝试渲染我的 xml 视图之一 但收到此错误 Exception raised during rendering Binary XML file line 1 No start tag found 有任何想法吗 我已将清单文件包含
  • X 代码:异常。如何查明原因?

    Xcode 4 6 1 与 iOS 6 1 我正在使用 StackMob 的远程数据库 应用程序首先出现错误 在我单击 播放 几次后 它运行良好并且与服务器通信正常 不确定如何检测问题以及是否应该关注 我有以下异常断点设置 The appl
  • compareTo 错误:无法对基本类型 int 调用compareTo(int)

    不知道如何获得compareTo为了不给出错误 非常失落 尝试更改多行代码 public voide addValue int newNumber int index 0 while index lt numbers size number
  • ssh 配置可以在家里工作,但不能从另一个目录工作

    我可以解决我的问题 但我很好奇为什么它没有按应有的方式工作 问题 In ssh config有一个条目 Host git HostName git myserver com User gitolite Identityfile gitoli
  • Dataflow 模板是否支持 BigQuery 接收器选项的模板输入?

    由于我正在运行一个正在运行的静态数据流 因此我想从此模板创建一个模板 以便我可以轻松地重用该数据流 而无需输入任何命令行 继创建模板官方的教程没有提供模板输出的示例 我的数据流以 BigQuery 接收器结束 该接收器接受一些参数 例如用于
  • 使用 avcodec_decode_audio4() 解码 AAC 时出错

    我尝试使用 FFmpeg 本机解码器解码 AAC 并遇到错误 SSR is not implemeted Update your FFmpeg version to newest from Git If the problem still