我的程序从网络接收 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/