AVPacket
保存的是解码前的数据,也就是压缩后的数据。该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据。
AVPacket
的使用通常离不开下面4个函数:
-
使用
av_packet_alloc
来创建一个AVPacket
的实例,但该函数并不会为数据分配空间,其指向数据域的指针为NULL。
通常调用av_read_frame
将流中的数据读取到AVPacket
中。 -
av_packet_free
void av_packet_free(AVPacket **pkt) { if (!pkt || !*pkt) return; av_packet_unref(*pkt); av_freep(pkt); }
首先将AVPacket指向的数据域的引用技术减1(数据域的引用技术减为0时会自动释放)
接着,释放为AVPacket
分配的空间。av_packet_ref
int av_packet_ref(AVPacket *dst, const AVPacket *src) { int ret; ret = av_packet_copy_props(dst, src); if (ret < 0) return ret; if (!src->buf) { ret = packet_alloc(&dst->buf, src->size); if (ret < 0) goto fail; if (src->size) memcpy(dst->buf->data, src->data, src->size); dst->data = dst->buf->data; } else { dst->buf = av_buffer_ref(src->buf); if (!dst->buf) { ret = AVERROR(ENOMEM); goto fail; } dst->data = src->data; } dst->size = src->size; return 0; fail: av_packet_free_side_data(dst); return ret; }
av_packet_free
替代 已被废弃的av_free_packet
,其功能是将packet指向的数据域的引用技术减1,并将packe的值设为默认值。该函数并不会释放packet的空间,释放不使用的packet需要调用av_packet_free
。
解码时AVPacket
典型的使用场景为:
AVPacket *packet = av_packet_alloc(); // 创建一个packet
while(av_read_frame(pFormatCtx,packet))
{
if(packet->stream_index == audio_index)
{
...
}
else if(packet->stream_index == video_index)
{
...
}
av_packet_unref(packet); // 不要忘记减少引用技术
}
av_packet_free(packet);
链接地址: 点击打开链接