当前位置: 首页 > news >正文

FFmpeg03:多媒体文件处理基础

在这里插入图片描述

日志系统

  • #include <libavutil/log.h>
  • av_log_set_level(AV_LOG_DEBUG)
  • av_log(NULL, AV_LOG_INFO, “…%s\n”, op)

常用日志级别

AV_LOG_ERROR
AV_LOG_WARNING
AV_LOG_INFO

Demo

log.cpp

#include <iostream>
extern "C" {
#include <libavutil/log.h>
}int main() {// Set the log level to AV_LOG_DEBUGav_log_set_level(AV_LOG_DEBUG);// Log a message at the INFO levelav_log(nullptr, AV_LOG_INFO, "This is an informational message.\n");// Log a message at the WARNING levelav_log(nullptr, AV_LOG_WARNING, "This is a warning message.\n");// Log a message at the ERROR levelav_log(nullptr, AV_LOG_ERROR, "This is an error message.\n");return 0;
}
clang++ log.cpp -o log $(pkg-config --cflags --libs libavutil)

文件的删除与重命名

avpriv_io_delete()
avpriv_io_move()

操作目录

avio_open_dir()
avio_read_dir()
avio_close_dir()/* -------重要结构体----- */
AVIODirContext // 操作目录的上下文
AVIODirEntry // 目录项,用于存放文件名,文件大小等信息

Demo

实现ls命令

#include <iostream>extern "C" {#include <libavutil/log.h>#include <libavformat/avformat.h>
}int main(void) {int ret;AVIODirContext *ctx = nullptr;AVIODirEntry *entry = nullptr;av_log_set_level(AV_LOG_INFO);ret = avio_open_dir(&ctx, "./", nullptr);if (ret < 0) {av_log(nullptr, AV_LOG_ERROR, "Could not open directory: %s\n", av_err2str(ret));return ret;}while (1) {ret = avio_read_dir(ctx, &entry);if (ret < 0) {av_log(nullptr, AV_LOG_ERROR, "Could not read directory: %s\n", av_err2str(ret));break;}if (!entry) {break; // No more entries}av_log(nullptr, AV_LOG_INFO, "%12"PRId64" %s\n", entry->size, entry->name);avio_free_directory_entry(&entry);}avio_close_dir(&ctx);return 0;
}
clang++ ffmpeg_ls.cpp -o ffmpeg_ls $(pkg-config --cflags --libs libavutil libavformat)

处理流数据的基本概念

  • 多媒体文件其实是个容器
  • 在容器里有很多流(Stream/Track)
  • 每种流是由不同的编码器编码的
  • 从流中读出的数据称为包
  • 在一个包中包含着一个或多个帧

几个重要的结构体

  • AVFormatContext
  • AVStream
  • AVPacket

操作流数据的基本步骤

解复用----> 获取流------>读数据包----->释放资源

打印音视频Meta信息

  • av_register_all (5.0以后就被取消了)
  • avformat_open_input() / avformat_close_input
  • av_dump_format()

extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/log.h>
}int main() {int ret;AVFormatContext *fmt_ctx = nullptr;av_log_set_level(AV_LOG_INFO);// av_register_all(); ffmpeg 4.0 and later do not require thisret = avformat_open_input(&fmt_ctx, "./input.mp4", nullptr, nullptr);if (ret < 0) {av_log(nullptr, AV_LOG_ERROR, "Could not open input file: %s\n", av_err2str(ret));return ret;}av_dump_format(fmt_ctx, 0, "./input.mp4", 0);avformat_close_input(&fmt_ctx);return 0;
}
clang++ ffmpeg_meta.cpp -o mediainfo $(pkg-config --cflags --libs libavutil libavformat)
http://www.dtcms.com/a/344899.html

相关文章:

  • ffmpeg 中 crc32 源码分析及调试
  • vagrant怎么在宿主机操作虚拟机里面的系统管理和软件安装
  • xilinx的oddr原语是否可以直接使用verilog实现?
  • ingress和service区别
  • 20250822解决荣品RD-RK3588-MID核心板出现插USB开机-长按RESET开机的问题
  • 基于LangChain + Milvus 实现RAG
  • 升级 Docker Compose 到最新版本:从安装到验证全指南
  • SOLIDWORKS 2025智能工具优化设计流程
  • 数据结构: 2-3 树的删除操作 (Deletion)
  • Maven的概念与Maven项目的创建
  • 线程异步操作
  • LoRA内部原理代码解析(52)
  • 【笔记】动手学Ollama 第七章 应用案例 Agent应用
  • SpringBoot项目创建的五种方式
  • 线性回归:机器学习中的基石
  • Unreal Engine UE_LOG
  • BigData大数据应用开发学习笔记(04)离线处理--离线分析Spark SQL
  • 用 Go 从零实现一个简易负载均衡器
  • SSM从入门到实战: 2.7 MyBatis与Spring集成
  • 计算机内存中的整型存储奥秘、大小端字节序及其判断方法
  • Bluedroid vs NimBLE
  • 北京-测试-入职甲方金融-上班第三天
  • AR眼镜巡检系统在工业互联网的应用:AR+IoT
  • JAVA后端开发——API状态字段设计规范与实践
  • 目标检测数据集转换为图像分类数据集
  • Pandas中的SettingWithCopyWarning警告出现原因及解决方法
  • 共享内存详细解释
  • 前端在WebSocket中加入Token的方法
  • 12-Linux系统用户管理及基础权限
  • 塞尔达传说 王国之泪 PC/手机双端 免安装中文版