c++ - 如何使用 AVPacket 作为局部变量(或所说的临时变量)

标签 c++ audio memory ffmpeg

我的程序从网络接收 aac 音频流,并使用 ffmpeg 解码流,所以我必须将流数据打包到 AVPacket 结构,我使用局部变量来执行此操作,代码如下:

bool OnRecvAACStream(const char * audioDataPtr,int audioDataSize,int64_t tBeg,int64_t tDura)
{
    AVPacket pkt_tmp;   // local varible
    av_init_packet(&pkt_tmp);
    pkt_tmp.data = audioDataPtr;
    pkt_tmp.size = audioDataSize;
    pkt_tmp.pts = tBeg;
    pkt_tmp.duration = tDura;
    
    if (avcodec_send_packet(m_codec_ctx, &pkt_tmp) < 0)
    {
        assert(false);
        return false;
    }
    while (avcodec_receive_frame(m_codec_ctx, m_dec_frame) == 0)
    {
       // read out dec audio data
       ...
    }
    
    retur true;
}

我只是使用 av_init_packet() 来初始化本地变量,没有调用 av_packet_unref() 和 av_packet_free() ,所以它有效吗?有内存泄漏问题吗?

最佳答案

av_init_packet不分配任何东西。只需为 AVPacket 结构设置默认值,不触及数据和大小字段。您应该跟踪 .data部分,当分配任何内容时,必须在覆盖之前将其释放。
根据上面的代码,你可能想使用 av_frame_free和/或 av_frame_unref , 在你完成当前帧和下一帧之前。

关于c++ - 如何使用 AVPacket 作为局部变量(或所说的临时变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63590275/

相关文章:

ios - 模拟器和设备上的“事件字节”不同

c++ - 定义新的内存类型

.net - 内存随机化作为应用程序安全增强?

java - 文件扩展名 - 用于文件。 (.Mp3 和 .Wav)

c++ - 为什么我们需要 libstdc++.so?

c++ - 将 uint32_t 添加到不同命名空间中的队列时发生内存泄漏

c++ - 在 c++ 中执行此操作的任何更好方法,计算拼图的解决方案(49!结果,49 个循环)

java - Android Media Player 同时播放多首歌曲

iphone - 在后台模式下播放音效

c++ - 如何判断一组坐标是否为正多边形的顶点?