gpt4 book ai didi

ffmpeg - avcodec_open 仅适用于未压缩格式

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

上下文:我有一个名为 libffmpeg.so 的文件,我取自 APKAndroid正在使用 FFMPEG 的应用程序在多个 Codecs 之间对文件进行编码和解码.因此,我认为这是使用编码选项启用编译的,并且这个 .so 文件在某处包含所有编解码器。该文件是为 ARM 编译的(我们在 ARMEABI 上称为 Android 的个人资料)。

我还有一个非常完整的类(class),可以调用 API来自 ffmpeg .不管这个 static library 的起源是什么,所有调用响应都很好,并且大多数端点都存在。如果不是,我添加它们或修复已弃用的一个。

当我想创建 ffmpeg Encoder ,返回的编码器是正确的。

var thisIsSuccessful = avcodec_find_encoder(myAVCodec.id);

现在,我遇到了 Codecs 的问题.问题是——假设出于好奇——我遍历所有编解码器的列表,看看我可以使用 avcodec_open 调用打开哪个编解码器......
        AVCodec codec;

var res = FFmpeg.av_codec_next(&codec);
while((res = FFmpeg.av_codec_next(res)) != null)
{
var name = res->longname;


AVCodec* encoder = FFmpeg.avcodec_find_encoder(res->id);
if (encoder != null) {
AVCodecContext c = new AVCodecContext ();

/* put sample parameters */
c.bit_rate = 64000;
c.sample_rate = 22050;
c.channels = 1;

if (FFmpeg.avcodec_open (ref c, encoder) >= 0) {
System.Diagnostics.Debug.WriteLine ("[YES] - " + name);
}
} else {
System.Diagnostics.Debug.WriteLine ("[NO ] - " + name);
}
}

...然后只有未压缩的编解码器在工作。 (YUV、FFmpeg 视频 1 等)

我的假设是:
  • 编译到 .so 文件时缺少的选项
  • av_open_codec 调用取决于我在调用中引用的 AVCodecContext 的属性。

  • 我真的很好奇为什么只返回一组最小的未压缩编解码器?

    [编辑]

    @ronald-s-bultje 的回答让我阅读了 AVCodecContext API 描述,当在编码器上使用时,有很多带有“必须由用户设置”的补充文件。在 AVCodecContext 上为这些参数设置一个值使大多数不错的编解码器可用:
    c.time_base = new AVRational (); // Output framerate. Here, 30fps
    c.time_base.num = 1;
    c.time_base.den = 30;
    c.me_method = 1; // Motion-estimation mode on compression -> 1 is none
    c.width = 640; // Source width
    c.height = 480; // Source height
    c.gop_size = 30; // Used by h264. Just here for test purposes.
    c.bit_rate = c.width * c.height * 4; // Randomly set to that...
    c.pix_fmt = FFmpegSharp.Interop.Util.PixelFormat.PIX_FMT_YUV420P; // Source pixel format

    最佳答案

    The av_open_codec calls is acting depending on the properties of the AVCodecContext I've referenced in the call.



    基本上就是这样。我的意思是,对于视频编码器,你甚至没有设置宽度/高度,所以大多数编码器真的不能指望做任何像这样有用的事情,而且是正确的。

    您可以使用例如设置默认参数avcodec_get_context_defaults3(),它应该可以帮助您在 AVCodecContext 中获得一些有用的设置。之后,将诸如 width/height/pix_fmt 之类的典型设置设置为描述您的输入格式的那些(如果您想进行音频编码 - 这实际上从您的问题中令人惊讶地不清楚,您需要设置一些不同的设置,例如 sample_fmt/sample_rate/channels,但同样的想法)。然后你应该比较好去。

    关于ffmpeg - avcodec_open 仅适用于未压缩格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30428011/

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