gpt4 book ai didi

c++ - 我调用了av_probe_input_format3(),现在我想调用avcodec_find_decoder(),如何在编解码器中转换格式?

转载 作者:行者123 更新时间:2023-12-04 22:58:07 25 4
gpt4 key购买 nike

所以......我正在处理一个输入数据进入缓冲区(即不是文件)的系统。我想确定要创建哪个解码器来解压缩音频流(MP3、WAV、OGG,...)所以显然我不知道输入格式。
我发现我可以使用 av_probe_input_format[23]() 确定格式功能。那部分效果很好,我得到了 format与我用作输入的文件匹配的指针。

AVInputFormat * format(av_probe_input_format3(&pd, true, &score));
我可以打印 format->nameformat->long_name这些是正确的类型(因此检测按预期工作)。
现在,我试图了解如何转换 AVInputFormat *变成 AVCodec *所以我可以调用 avcodec_alloc_context3(codec)创建实际的音频解码器。
我发现了几个函数,我像这样使用它们:
AVCodecID const codec_id(av_codec_get_id(format->codec_tag, format->raw_codec_id));
AVCodec * codec(avcodec_find_decoder(codec_id));
问题1. raw_codec_id字段被标记为“私有(private)”(不应访问/使用客户代码中的任何位置)。
问题2.第一个函数总是返回 AV_CODEC_ID_NONE ( 0 )所以当然第二次调用每次都会失败。
难道我做错了什么?有没有办法创建一个通用解码器来自动检测我作为输入的音频类型? (也就是说,这是实现这项工作的唯一方法吗?)

最佳答案

好的,所以事实是尝试直接使用这些函数几乎是徒劳的。我在设计上遇到的问题是它迫使我实际上有一个回调,而这个回调迫使我有一个线程(即我必须以某种方式从流中提供数据,而不是从文件等!)
所以我可以使用 avformat_open_input()正如 Gyan 所说,只有我必须拥有自己的 AVIOContext .我希望我可以用传入的数据调用函数并避免管道概念。这里的问题是一些后台进程可能是使用 fork() 的服务器。因此你需要非常小心(即 fork() 对线程不友好)。

关于c++ - 我调用了av_probe_input_format3(),现在我想调用avcodec_find_decoder(),如何在编解码器中转换格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65298747/

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