
日志系统
- #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
cpp
#include <iostream>
extern "C" {
#include <libavutil/log.h>
}
int main() {
// Set the log level to AV_LOG_DEBUG
av_log_set_level(AV_LOG_DEBUG);
// Log a message at the INFO level
av_log(nullptr, AV_LOG_INFO, "This is an informational message.\n");
// Log a message at the WARNING level
av_log(nullptr, AV_LOG_WARNING, "This is a warning message.\n");
// Log a message at the ERROR level
av_log(nullptr, AV_LOG_ERROR, "This is an error message.\n");
return 0;
}
shell
clang++ log.cpp -o log $(pkg-config --cflags --libs libavutil)
文件的删除与重命名
cpp
avpriv_io_delete()
avpriv_io_move()
操作目录
cpp
avio_open_dir()
avio_read_dir()
avio_close_dir()
/* -------重要结构体----- */
AVIODirContext // 操作目录的上下文
AVIODirEntry // 目录项,用于存放文件名,文件大小等信息
Demo
实现ls命令
cpp
#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;
}
shell
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()
cpp
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 this
ret = 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;
}
shell
clang++ ffmpeg_meta.cpp -o mediainfo $(pkg-config --cflags --libs libavutil libavformat)