av_get_pix_fmt_name 详解
av_get_pix_fmt_name是 FFmpeg 库中的一个函数,用于获取像素格式的名称(字符串表示)。
函数原型
const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt);
参数说明
-
pix_fmt: 要查询的像素格式枚举值,类型为
AVPixelFormat
返回值
-
返回指向像素格式名称字符串的常量指针
-
如果像素格式不存在或无效,返回
NULL
功能详解
1. 主要用途
将 AVPixelFormat枚举值转换为人类可读的字符串名称,常用于:
-
调试输出
-
日志记录
-
配置信息显示
-
错误信息报告
2. 像素格式示例
AV_PIX_FMT_YUV420P -> "yuv420p"
AV_PIX_FMT_RGB24 -> "rgb24"
AV_PIX_FMT_NV12 -> "nv12"
AV_PIX_FMT_GRAY8 -> "gray8"
AV_PIX_FMT_YUV422P -> "yuv422p"
AV_PIX_FMT_YUV444P -> "yuv444p"
AV_PIX_FMT_RGBA -> "rgba"
AV_PIX_FMT_NONE -> NULL
使用示例
示例1:基本使用
#include
void print_pixel_format_info(enum AVPixelFormat pix_fmt) {
const char *fmt_name = av_get_pix_fmt_name(pix_fmt);
if (fmt_name) {
printf("Pixel format: %s
", fmt_name);
} else {
printf("Unknown or invalid pixel format
");
}
}
int main() {
// 获取常见像素格式的名称
printf("YUV420P: %s
", av_get_pix_fmt_name(AV_PIX_FMT_YUV420P));
printf("RGB24: %s
", av_get_pix_fmt_name(AV_PIX_FMT_RGB24));
printf("NV12: %s
", av_get_pix_fmt_name(AV_PIX_FMT_NV12));
return 0;
}
示例2:获取解码器输出格式
#include
#include
void print_decoder_info(AVCodecContext *codec_ctx) {
if (codec_ctx->pix_fmt != AV_PIX_FMT_NONE) {
const char *fmt_name = av_get_pix_fmt_name(codec_ctx->pix_fmt);
printf("Decoder pixel format: %s
", fmt_name);
}
}
示例3:与像素格式描述结构结合使用
#include
void print_detailed_pixfmt_info(enum AVPixelFormat pix_fmt) {
const char *name = av_get_pix_fmt_name(pix_fmt);
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
if (name && desc) {
printf("Format: %s
", name);
printf("Bits per pixel: %d
", av_get_bits_per_pixel(desc));
printf("Has alpha: %s
", desc->flags & AV_PIX_FMT_FLAG_ALPHA ? "yes" : "no");
printf("Is planar: %s
", desc->flags & AV_PIX_FMT_FLAG_PLANAR ? "yes" : "no");
}
}
相关函数
1. av_get_pix_fmt()
enum AVPixelFormat av_get_pix_fmt(const char *name);
-
与
av_get_pix_fmt_name相反 -
通过名称字符串获取对应的像素格式枚举值
-
不区分大小写
// 示例
const char *name = "yuv420p";
enum AVPixelFormat fmt = av_get_pix_fmt(name);
if (fmt == AV_PIX_FMT_NONE) {
printf("Unsupported pixel format: %s
", name);
}
2. av_pix_fmt_desc_get()
const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt);
-
获取更详细的像素格式描述信息
-
返回
AVPixFmtDescriptor结构体指针
实际应用场景
场景1:视频处理管道
void setup_video_processing(AVCodecContext *codec_ctx,
SwsContext **sws_ctx,
enum AVPixelFormat output_fmt) {
enum AVPixelFormat input_fmt = codec_ctx->pix_fmt;
const char *input_name = av_get_pix_fmt_name(input_fmt);
const char *output_name = av_get_pix_fmt_name(output_fmt);
printf("Converting from %s to %s
", input_name, output_name);
*sws_ctx = sws_getContext(
codec_ctx->width, codec_ctx->height, input_fmt,
codec_ctx->width, codec_ctx->height, output_fmt,
SWS_BILINEAR, NULL, NULL, NULL
);
}
场景2:格式验证
int validate_pixel_format(const char *fmt_str) {
enum AVPixelFormat fmt = av_get_pix_fmt(fmt_str);
if (fmt == AV_PIX_FMT_NONE) {
fprintf(stderr, "Unsupported pixel format: %s
", fmt_str);
// 列出支持的格式
fprintf(stderr, "Supported formats include: ");
for (int i = 0; i < AV_PIX_FMT_NB; i++) {
const char *name = av_get_pix_fmt_name(i);
if (name) fprintf(stderr, "%s ", name);
}
fprintf(stderr, "
");
return -1;
}
printf("Using pixel format: %s
", av_get_pix_fmt_name(fmt));
return 0;
}
注意事项
-
线程安全性:
-
函数是线程安全的
-
返回的字符串指针指向静态数据,不需要释放
-
-
返回值检查:
-
总是检查返回值是否为
NULL -
AV_PIX_FMT_NONE会返回NULL
-
-
性能考虑:
-
函数只是简单的查找表查询,开销很小
-
适合频繁调用
-
-
头文件依赖:
#include // 主要头文件
#include // 像素格式定义
完整示例程序
#include
#include
int main() {
// 定义一些常见的像素格式
enum AVPixelFormat formats[] = {
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_YUV422P,
AV_PIX_FMT_YUV444P,
AV_PIX_FMT_NV12,
AV_PIX_FMT_RGB24,
AV_PIX_FMT_BGR24,
AV_PIX_FMT_RGBA,
AV_PIX_FMT_GRAY8,
AV_PIX_FMT_NONE
};
// 获取并打印所有格式名称
printf("Supported pixel formats:
");
for (int i = 0; formats[i] != AV_PIX_FMT_NONE; i++) {
const char *name = av_get_pix_fmt_name(formats[i]);
if (name) {
printf(" %d: %s
", formats[i], name);
}
}
// 演示反向查询
const char *test_names[] = {"yuv420p", "rgb24", "unknown", NULL};
printf("
Reverse lookup:
");
for (int i = 0; test_names[i] != NULL; i++) {
enum AVPixelFormat fmt = av_get_pix_fmt(test_names[i]);
if (fmt != AV_PIX_FMT_NONE) {
printf(" '%s' -> %d (%s)
",
test_names[i],
fmt,
av_get_pix_fmt_name(fmt));
} else {
printf(" '%s' -> not found
", test_names[i]);
}
}
return 0;
}
编译和链接
# 编译命令
gcc -o pixfmt_demo pixfmt_demo.c
-lavutil -lm
-I/path/to/ffmpeg/include
-L/path/to/ffmpeg/lib
输出示例
Supported pixel formats:
0: yuv420p
1: yuyv422
2: rgb24
3: bgr24
4: yuv422p
5: yuv444p
6: yuv410p
7: yuv411p
... (更多格式)
Reverse lookup:
'yuv420p' -> 0 (yuv420p)
'rgb24' -> 2 (rgb24)
'unknown' -> not found
总结
av_get_pix_fmt_name是 FFmpeg 像素格式处理的基础函数,主要用于:
-
调试和日志记录
-
格式转换的配置和验证
-
用户界面的格式显示
-
错误信息的格式化输出
它与 av_get_pix_fmt()形成互补,提供了像素格式枚举值和字符串表示之间的双向转换功能,是视频处理编程中常用的工具函数。






