gpt4 book ai didi

c++ - 两次调用 avformat_find_stream_info() 崩溃

转载 作者:行者123 更新时间:2023-12-04 22:49:56 26 4
gpt4 key购买 nike

我的 FFmpeg 版本是 4.4。
我的代码中有一个逻辑连续调用 avformat_find_stream_info() 两次,但我不明白为什么它在这里崩溃。我尝试了单步调试,但没有成功。这是我可以直接运行的简单代码:

#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>

int main()
{
av_log_set_level(AV_LOG_DEBUG);
const char* in_filename_a = "aoutput.aac";
AVFormatContext* ifmt_ctx_a = NULL;
int ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, 0, 0);
if (ret < 0)
{
fprintf(stderr, "Could not open input_a %s", in_filename_a);
return -1;
}
fprintf(stderr, "before ifmt_ctx_a=0x%x\n", ifmt_ctx_a->streams[0]);
ret = avformat_find_stream_info(ifmt_ctx_a, 0);
if (ret < 0)
{
fprintf(stderr, "Could not find input_a stream info");
return -1;
}
fprintf(stderr, "after ifmt_ctx_a=0x%x\n", ifmt_ctx_a->streams[0]);
/// crashed here
ret = avformat_find_stream_info(ifmt_ctx_a, 0);
if (ret < 0)
{
fprintf(stderr, "Could not find input_a stream info");
return -1;
}

}
call stack

最佳答案

很少有暗示暗示我们不应该执行 avformat_find_stream_info两次。

  • 文档说:“检查过的数据包可能会被缓冲以供以后处理。”
    有一个变化是第一次执行缓冲了几个数据包,第二次执行尝试再次缓冲数据包而不分配额外的空间。
  • 控制台将日志消息打印为:

  • Before avformat_find_stream_info() pos: 0 bytes read:65696 seeks:4 nb_streams:1
    After avformat_find_stream_info() pos: 27420 bytes read:65696 seeks:4 frames:50


    这些消息暗示位置从 0 开始。至 27420 . ifmt_ctx_a->streams[0]的地址是一样的,但是执行第一个 avformat_find_stream_info做了一些寻找(所以第二次执行与第一次不同)。
  • 使用调试器,我们可以看到 ifmt_ctx_a->pb[0].buf_ptr在第一次执行 avformat_find_stream_info 后增加.

  • 笔记:
  • 我不知道崩溃是正常行为还是 Libavformat 库中的错误。
    我没有尝试查看 Libavformat 的源代码。

  • 要阅读两次,您可以关闭并重新打开 ifmt_ctx_a :
    avformat_close_input(&ifmt_ctx_a);   
    ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, 0, 0);
    我看不出有任何理由这样做...

    其他选项是打开另一个 AVFormatContext:
    AVFormatContext* ifmt_ctx_a = NULL;
    int ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, 0, 0);
    if (ret < 0)
    {
    fprintf(stderr, "Could not open input_a %s", in_filename_a);
    return -1;
    }

    ret = avformat_find_stream_info(ifmt_ctx_a, NULL);
    if (ret < 0)
    {
    fprintf(stderr, "Could not find input_a stream info");
    return -1;
    }

    //Opening another AVFormatContext:
    ////////////////////////////////////////////////////////////////////////////
    AVFormatContext* ifmt_ctx_a2 = NULL;
    ret = avformat_open_input(&ifmt_ctx_a2, in_filename_a, 0, 0);
    if (ret < 0)
    {
    fprintf(stderr, "Could not open input_a %s", in_filename_a);
    return -1;
    }

    ret = avformat_find_stream_info(ifmt_ctx_a2, NULL);
    if (ret < 0)
    {
    fprintf(stderr, "Could not find input_a stream info");
    return -1;
    }
    ////////////////////////////////////////////////////////////////////////////

    关于c++ - 两次调用 avformat_find_stream_info() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70424422/

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