【再深入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_output为0时,表示这是一个输入格式上下文,通常是已经打开用于读取的文件。当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的结构体,比如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);

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

相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone5 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui