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