【再深入FFMPEG】调试函数

【再深入FFMPEG】过滤器Filter执行流程

【再深入FFMPEG】libavdevice的作用和android_camera的使用

【再深入FFMPEG】编码保存到文件

再深入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_output0时,表示这是一个输入格式上下文,通常是已经打开用于读取的文件。当is_output为非0时,表示这是一个输出格式上下文,通常是准备用于写入的文件。

使用 av_dump_format 可以快速查看媒体文件或流的详细结构,这对于开发者理解媒体文件的构成和调试FFmpeg相关的程序非常有帮助。

以下是一些常用的调试和信息输出函数:

  1. av_log: FFmpeg 的日志系统函数。它可以用来输出日志信息,开发者可以通过设置不同的日志级别来控制输出信息的详细程度。

    arduino 复制代码
    void av_log(void* avcl, int level, const char* format, ...);
  2. av_strerror: 用于将错误码转换为人类可读的字符串。

    arduino 复制代码
    int av_strerror(int errnum, char* errbuf, size_t errbuf_size);
  3. avcodec_string: 用于打印编解码器的信息。

    arduino 复制代码
    void avcodec_string(char* buf, int buf_size, AVCodecContext* enc, int encode);
  4. av_opt_show2: 用于打印对象的选项及其当前值。

    arduino 复制代码
    int av_opt_show2(void* obj, void* av_log_obj, int req_flags, int rej_flags);
  5. avfilter_graph_dump: 用于获取一个字符串,该字符串描述了过滤器图的所有过滤器、链接和格式。

    arduino 复制代码
    char* avfilter_graph_dump(AVFilterGraph* graph, const char* options);
  6. av_frame_dump : 用于输出 AVFrame 的详细信息,如格式、尺寸、PTS 等。

    arduino 复制代码
    void av_frame_dump(const AVFrame* frame);
  7. avformat_network_init/avformat_network_deinit: 用于初始化/清理网络组件,有助于调试网络相关的问题。

    arduino 复制代码
    int avformat_network_init(void);
    int avformat_network_deinit(void);
  8. av_dict_get : 用于获取和打印字典(AVDictionary)中的键值对,这在处理元数据时特别有用。

    objectivec 复制代码
    AVDictionaryEntry* 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的结构体,比如AVFormatContextAVCodecContext,用于指明日志来源。
  • 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);

这将打印出过滤器图的描述。

相关推荐
试行8 分钟前
Android实现自定义下拉列表绑定数据
android·java
Dingdangr5 小时前
Android中的Intent的作用
android
技术无疆5 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
GEEKVIP5 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
Jouzzy12 小时前
【Android安全】Ubuntu 16.04安装GDB和GEF
android·ubuntu·gdb
superconvert12 小时前
主流流媒体的综合性能大 PK ( smart_rtmpd, srs, zlm, nginx rtmp )
websocket·ffmpeg·webrtc·hevc·rtmp·h264·hls·dash·rtsp·srt·flv
极客先躯12 小时前
java和kotlin 可以同时运行吗
android·java·开发语言·kotlin·同时运行
Good_tea_h15 小时前
Android中的单例模式
android·单例模式
cuijiecheng201818 小时前
音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现
ffmpeg·音视频·aac
0点51 胜18 小时前
[ffmpeg] 视频格式转换
ffmpeg