再深入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);
这将打印出过滤器图的描述。