如何知道ffmpeg中一个AVPacket的大小?

时间:2013-06-02 07:02:15

标签: memory ffmpeg

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

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:1)

如果您提供自己的数据缓冲区,则其大小必须为mininum 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提供给编码编解码器。内存将自动分配。 从编码器返回时,如果got_output设置为1,则必须调用av_free_packet。 如果出现错误,FFmpeg将自动释放AVPacket内容。