再深入FFMPEG
调试函数
av_dump_format
是 FFmpeg 库中的一个调试功能函数,它的作用是将输入或输出的多媒体格式(AVFormatContext
)的详细信息打印输出,方便开发者进行调试。这些信息包括流的数量、流的类型(视频、音频、字幕等)、编解码器的ID和名称、比特率、帧率等。
函数的原型如下:
arduino
void av_dump_format(AVFormatContext *ic,
int index,
const char *url,
int is_output);
参数说明:
ic
:指向AVFormatContext
的指针,这个结构包含了要打印的媒体格式的信息。index
:通常设置为0,用于标识打印信息时的索引号,主要用于区分当处理多个文件或流时的输出。url
:媒体流的URL或文件名。is_output
: 一个标志,指示传递的AVFormatContext
是用于输出(即编码和写入文件)还是输入(即解码和读取文件)。当is_output
为0
时,表示这是一个输入格式上下文,通常是已经打开用于读取的文件。当is_output
为非0
时,表示这是一个输出格式上下文,通常是准备用于写入的文件。
使用 av_dump_format
可以快速查看媒体文件或流的详细结构,这对于开发者理解媒体文件的构成和调试FFmpeg相关的程序非常有帮助。
以下是一些常用的调试和信息输出函数:
-
av_log: FFmpeg 的日志系统函数。它可以用来输出日志信息,开发者可以通过设置不同的日志级别来控制输出信息的详细程度。
arduinovoid av_log(void* avcl, int level, const char* format, ...);
-
av_strerror: 用于将错误码转换为人类可读的字符串。
arduinoint av_strerror(int errnum, char* errbuf, size_t errbuf_size);
-
avcodec_string: 用于打印编解码器的信息。
arduinovoid avcodec_string(char* buf, int buf_size, AVCodecContext* enc, int encode);
-
av_opt_show2: 用于打印对象的选项及其当前值。
arduinoint av_opt_show2(void* obj, void* av_log_obj, int req_flags, int rej_flags);
-
avfilter_graph_dump: 用于获取一个字符串,该字符串描述了过滤器图的所有过滤器、链接和格式。
arduinochar* avfilter_graph_dump(AVFilterGraph* graph, const char* options);
-
av_frame_dump : 用于输出
AVFrame
的详细信息,如格式、尺寸、PTS 等。arduinovoid av_frame_dump(const AVFrame* frame);
-
avformat_network_init/avformat_network_deinit: 用于初始化/清理网络组件,有助于调试网络相关的问题。
arduinoint avformat_network_init(void); int avformat_network_deinit(void);
-
av_dict_get : 用于获取和打印字典(
AVDictionary
)中的键值对,这在处理元数据时特别有用。objectivecAVDictionaryEntry* av_dict_get(const AVDictionary* m, const char* key, const AVDictionaryEntry* prev, int flags);
来具体介绍一下这些函数:
1. av_log
av_log
是FFmpeg的日志函数,用于输出日志信息。
arduino
void av_log(void* avcl, int level, const char* format, ...);
avcl
: 可以是任何FFmpeg的结构体,比如AVFormatContext
或AVCodecContext
,用于指明日志来源。level
: 日志级别,例如AV_LOG_INFO
,AV_LOG_ERROR
,AV_LOG_DEBUG
等。format
: 类似于printf
的格式字符串。...
: 可变参数,用于格式字符串。
例子:
objectivec
av_log(NULL, AV_LOG_INFO, "This is an info message: %s\n", "Hello World");
这将输出一个信息级别的日志消息。
2. av_strerror
av_strerror
用于将错误码转换为可读的错误描述。
arduino
int av_strerror(int errnum, char* errbuf, size_t errbuf_size);
errnum
: 错误码,通常是FFmpeg函数返回的负值。errbuf
: 用户提供的缓冲区,用于存储错误描述。errbuf_size
: 缓冲区的大小。
例子:
objectivec
char errbuf[256];
int ret = avformat_open_input(&ctx, "test.mp4", NULL, NULL);
if (ret < 0) {
av_strerror(ret, errbuf, sizeof(errbuf));
av_log(NULL, AV_LOG_ERROR, "Error opening file: %s\n", errbuf);
}
如果avformat_open_input
失败,将使用av_strerror
来获取错误描述并通过av_log
打印。
3. avcodec_string
avcodec_string
用于打印出与AVCodecContext
相关的编解码器信息。
arduino
void avcodec_string(char* buf, int buf_size, AVCodecContext* enc, int encode);
buf
: 用于存储编解码器信息字符串的缓冲区。buf_size
: 缓冲区的大小。enc
: 指向AVCodecContext
的指针。encode
: 指示是编码器还是解码器,非0表示编码器。
例子:
scss
char info[512];
AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);
avcodec_string(info, sizeof(info), codec_ctx, 1);
av_log(NULL, AV_LOG_INFO, "Codec info: %s\n", info);
这将打印出编码器的信息。
4. av_opt_show2
av_opt_show2
用于打印对象的选项及其当前值。
arduino
int av_opt_show2(void* obj, void* av_log_obj, int req_flags, int rej_flags);
obj
: 包含选项的对象。av_log_obj
: 用于日志输出的对象。req_flags
: 请求的选项标志。rej_flags
: 拒绝的选项标志。
例子:
ini
AVCodecContext* codec_ctx = avcodec_alloc_context3(codec);
av_opt_show2(codec_ctx, NULL, AV_OPT_FLAG_DECODING_PARAM, AV_OPT_FLAG_ENCODING_PARAM);
这将打印出解码器上下文的所有选项和当前值,但不包括编码参数。
5. avfilter_graph_dump
avfilter_graph_dump
用于获取描述过滤器图的字符串。
arduino
char* avfilter_graph_dump(AVFilterGraph* graph, const char* options);
graph
: 过滤器图的指针。options
: 用于调整输出的选项字符串。
例子:
scss
AVFilterGraph* filter_graph = avfilter_graph_alloc();
// ... (设置过滤器图)
char* dump = avfilter_graph_dump(filter_graph, NULL);
av_log(NULL, AV_LOG_INFO, "Filter graph:\n%s\n", dump);
av_free(dump);
这将打印出过滤器图的描述。