1. FFmpeg日志系统的使用
- include <libavutil/log.h>
导入头文件 - av_log_set_level(AV_LOG_DEBUG)
日志级别 - av_log(NULL, AV_LOG_INFO, "...%S\N", op)
打印log
#include <libavutil/log.h>
void set_logs(void) {
av_log_set_level(AV_LOG_DEBUG);
av_log(NULL, AV_LOG_INFO, "打印了一下调试信息%s", "hello world!\n");
}
常见日志级别由高到低:
- AV_LOG_ERROR
- AV_LOG_WARNING
- AV_LOG_INFO
- AV_LOG_DEBUG
2. 文件的删除与重命名
- avpriv_io_delete()
- avpriv_io_move()
#include <libavformat/avformat.h>
#include <libavutil/log.h>
int main(int argc, const char * argv[]) {
int ret;
ret = avpriv_io_delete("./mytestfile.txt");
if (ret < 0) {
av_log(NULL, AV_LOG_INFO, "Failed to delete file %s", "mytestfile.txt");
}
return 0;
}
int re_name(const char *sources_url, const char *des_url) {
return avpriv_io_move(sources_url, des_url);
}
3. 操作目录重要函数
avio_open_dir()
打开avio_read_dir()
读取avio_close_dir()
关闭AVIODirContext
操作目录的上下文AVIODirEntry
目录项。用于存放文件名,文件大小等信息
//
// Created by 阮皓 on 2018/12/18.
// Copyright © 2018 阮皓. All rights reserved.
//
#include <stdio.h>
#include <libavutil/log.h>
#include <libavformat/avformat.h>
int main(int argc, const char * argv[]) {
av_log_set_level(AV_LOG_INFO);
AVIODirContext *ctx = NULL;
AVIODirEntry *entry = NULL;
int ret;
ret = avio_open_dir(&ctx, "/Users/ruanhao/Desktop/iOS/ffmpeg-learning/ffmpeg_log", NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "can't open dir:%s\n", av_err2str(ret));
// 若打开目录失败了,我们就直接跳转到关闭目录的位置,用goto
goto __fail;
}
while (1) {
ret = avio_read_dir(ctx, &entry);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Can't read dir:%s\n", av_err2str(ret));
return -1;
}
if (!entry) {
break;
}
av_log(NULL, AV_LOG_INFO, "%12"PRId64" %s \n",entry->size, entry->name);
// 释放entry
avio_free_directory_entry(&entry);
}
__fail:
avio_close_dir(&ctx);
return 0;
}
4. 多媒体文件的基本概念(一)
- 多媒体文件其实是一个容器
- 在容器里有很多的流(Stream/Track)
- 每种流是由不同的编码器编码的
- 从流中读出的数据称为包
- 在一个包中包含的一个或多个帧
几个重要的结构体
- AVFormatContext
- AVStream
- AVPacket