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