FFmpeg 中AVPacket的使用

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);

链接地址: 点击打开链接 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值