0

我正在使用 ffmpeg 库。我想知道一个数据包可以占用多少内存。我调试检查 AVPacket 上的成员,它们似乎都不合理,例如 AVPacket.size,ec。

4

2 回答 2

2

如果您提供自己的数据缓冲区,则它需要具有最小 FF_MIN_BUFFER_SIZE 的大小。然后,您将 AVPacket.size 设置为分配的大小,并将 AVPacket.data 设置为您分配的内存。

请注意,如果您提供自己的缓冲区并且缓冲区太小,所有 FFmpeg 解码例程都会失败。

另一种可能性是让 FFmpeg 为您计算最佳尺寸。然后执行以下操作:

AVPacket pkt;
pkt.size = 0;
pkt.data = NULL; // <-- the critical part is there
int got_output = 0;

ret = avcodec_encode_audio2(ctx, &pkt, NULL, &got_output);

并将此 AVPacket 提供给编码编解码器。内存将自动分配。您必须在从编码器返回时调用 av_free_packet,如果 got_output 设置为 1。FFmpeg 将在出现错误时自动释放 AVPacket 内容。

于 2013-06-11T01:47:28.517 回答
1

AVPacket::size保存引用数据的大小。因为它是一个通用的数据容器,所以这个问题没有明确的答案

一个数据包可以占用多少内存

它实际上可以从零到很多。一切都取决于数据类型、编解码器和其他相关参数。

来自 FFmpeg 示例:

static void audio_encode_example(const char *filename)
{
    // ...
    AVPacket pkt;
    // ...
    ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output);
    // ...
    if (got_output) {
        fwrite(pkt.data, 1, pkt.size, f); // <<--- AVPacket.size
        av_free_packet(&pkt);
    }
于 2013-06-02T07:56:36.150 回答