AVFrame 结构体分析
AVFrame 相关函数
AVFrame 引用计数
测试代码
Test_AVFrame.cpp
#include <iostream>
using namespace std;
extern "C" // 指定函数是 C 语言函数,函数目标名不包含重载标识,C++ 中调用 C 函数需要使用 extern "C"
{
// 引用 ffmpeg 头文件
#include "libavcodec/avcodec.h"
}
// 预处理指令导入库
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")
int main()
{
cout << "fitst ffmpeg" << endl;
cout << avcodec_configuration() << endl;
// 生成一个 AVFrame 对象
AVFrame* frame1 = av_frame_alloc();
int ret = 0;
frame1->width = 400;
frame1->height = 300;
frame1->format = AV_PIX_FMT_ABGR;
// 分配 buf 内存空间,16字节对齐方式,默认为32字节对齐
ret = av_frame_get_buffer(frame1, 16);
if (ret != 0)
{
char buf[1024] = { 0 };
av_strerror(ret, buf, sizeof(buf));
cout << buf << endl;
}
if (frame1->data[0] != nullptr)
{
cout << "frame->linesize[0] = " << frame1->linesize[0] << endl;
}
cout << "frame1->buf[0] ref count = " << av_buffer_get_ref_count(frame1->buf[0]) << endl;
AVFrame* frame2 = av_frame_alloc();
// 让 frame2 引用 frame1 的 buf,引用计数加一
av_frame_ref(frame2, frame1);
cout << "frame1->buf[0] ref count = " << av_buffer_get_ref_count(frame1->buf[0]) << endl;
cout << "frame2->buf[0] ref count = " << av_buffer_get_ref_count(frame2->buf[0]) << endl;
cout << "av_frame_unref(frame2)" << endl;
// 将 frame2 中 buf 的引用计数减一,buf 引用计数减为0时,则销毁 buf 所占用的内存空间,并将它的 buf 置为空
av_frame_unref(frame2);
cout << "frame1->buf[0] ref count = " << av_buffer_get_ref_count(frame1->buf[0]) << endl;
// 销毁一个 AVFrame 对象,并将它内部的 buf 引用计数减一,buf 引用计数减为0时,则销毁 buf 所占用的内存空间
av_frame_free(&frame1);
av_frame_free(&frame2);
return 0;
}
测试结果