【再深入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);

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

相关推荐
2501_9445215914 分钟前
Flutter for OpenHarmony 微动漫App实战:标签筛选功能实现
android·开发语言·前端·javascript·flutter
mjhcsp16 分钟前
如何做一个网站?
android
2501_9159090616 分钟前
在无需越狱的前提下如何对 iOS 设备进行文件管理与数据导出
android·macos·ios·小程序·uni-app·cocoa·iphone
_F_y40 分钟前
MySQL表的增删查改
android·数据库·mysql
海雅达手持终端PDA44 分钟前
海雅达Model 10X工业平板赋能MES系统全场景落地应用方案
android·物联网·硬件工程·能源·健康医疗·制造·平板
普马萨特1 小时前
如何从安卓系统中获取扫描到的 Wi‑Fi 的 MAC 地址和 RSSI?
android·macos
游戏开发爱好者82 小时前
iPhone 网络调试的过程,请求是否发出,是否经过系统代理,app 绕过代理获取数据
android·网络·ios·小程序·uni-app·iphone·webview
_李小白2 小时前
【Android 美颜相机】第十三天:GPUImage3x3ConvolutionFilter解析
android·数码相机
游戏开发爱好者82 小时前
在 Linux 环境通过命令行上传 IPA 到 App Store,iOS自动化构建与发布
android·linux·ios·小程序·uni-app·自动化·iphone
帅次2 小时前
系统分析师-移动应用系统分析与设计
android·ios·微信小程序·小程序·android studio·webview